swift中的正则表达式小结

作为一门先进的编程语言,Swift 可以说吸收了众多其他先进语言的优点,但是有一点却是让人略微失望的,就是 Swift 至今为止并没有在语言层面上支持正则表达式。

正则表达式的用处:

判断给定的字符串是否符合某一种规则(专门用于操作字符串)

- 电话号码,电子邮箱,URL...

- 可以直接百度别人写好的正则

- 别人真的写好了,而且测试过了,我们可以直接用

- 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责

过滤筛选字符串,网络爬虫

替换文字,QQ聊天,图文混排

语法规则

使用过程

1、创建规则
2、创建正则表达式对象
3、开始匹配

代码示例

private func check(str: String) {
 // 使用正则表达式一定要加try语句
 do {
  // - 1、创建规则
  let pattern = "[1-9][0-9]{4,14}"
  // - 2、创建正则表达式对象
  let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
  // - 3、开始匹配
  let res = regex.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count))
  // 输出结果
  for checkingRes in res {
   print((str as NSString).substringWithRange(checkingRes.range))
  }
 }
 catch {
  print(error)
 }
}

其他几个常用方法

 // 匹配字符串中所有的符合规则的字符串, 返回匹配到的NSTextCheckingResult数组
      public func matchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> [NSTextCheckingResult]
      // 按照规则匹配字符串, 返回匹配到的个数
      public func numberOfMatchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> Int

      // 按照规则匹配字符串, 返回第一个匹配到的字符串的NSTextCheckingResult
      public func firstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSTextCheckingResult?

      // 按照规则匹配字符串, 返回第一个匹配到的字符串的范围
      public func rangeOfFirstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSRange

使用子类来匹配日期、地址、和URL

看官网文档解释,可以知道这个 NSDataDetector 主要用来匹配日期、地址、和URL。在使用时指定要匹配的类型

public class NSDataDetector : NSRegularExpression {
 // all instance variables are private
 /* NSDataDetector is a specialized subclass of NSRegularExpression. Instead of finding matches to regular expression patterns, it matches items identified by Data Detectors, such as dates, addresses, and URLs. The checkingTypes argument should contain one or more of the types NSTextCheckingTypeDate, NSTextCheckingTypeAddress, NSTextCheckingTypeLink, NSTextCheckingTypePhoneNumber, and NSTextCheckingTypeTransitInformation. The NSTextCheckingResult instances returned will be of the appropriate types from that list.
 */
 public init(types checkingTypes: NSTextCheckingTypes) throws
 public var checkingTypes: NSTextCheckingTypes { get }
}
// 这个是类型选择
 public static var Date: NSTextCheckingType { get } // date/time detection
 public static var Address: NSTextCheckingType { get } // address detection
 public static var Link: NSTextCheckingType { get } // link detection

NSDataDetector 获取URL示例

 /**
匹配字符串中的URLS

- parameter str: 要匹配的字符串
*/
private func getUrl(str:String) {
 // 创建一个正则表达式对象
 do {
  let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))
  // 匹配字符串,返回结果集
  let res = dataDetector.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count))
  // 取出结果
  for checkingRes in res {
   print((str as NSString).substringWithRange(checkingRes.range))
  }
 }
 catch {
  print(error)
 }
}

".*?" 可以满足一些基本的匹配要求

如果想同时匹配多个规则 ,可以通过 "|" 将多个规则连接起来

将字符串中文字替换为表情

 /**
显示字符中的表情
- parameter str: 匹配字符串
*/
private func getEmoji(str:String) {
 let strM = NSMutableAttributedString(string: str)
 do {
  let pattern = "\\[.*?\\]"
  let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
  let res = regex.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count))
  var count = res.count
  // 反向取出文字表情
  while count > 0 {
   let checkingRes = res[--count]
   let tempStr = (str as NSString).substringWithRange(checkingRes.range)
   // 转换字符串到表情
   if let emoticon = EmoticonPackage.emoticonWithStr(tempStr) {
    print(emoticon.chs)
    let attrStr = EmoticonTextAttachment.imageText(emoticon, font: 18)
    strM.replaceCharactersInRange(checkingRes.range, withAttributedString: attrStr)
   }
  }
  print(strM)
  // 替换字符串,显示到label
  emoticonLabel.attributedText = strM
 }
 catch {
  print(error)
 }
}

TextKit 给URL高亮显示

主要用到三个类

NSTextStorage
NSLayoutManager
NSTextContainer

自定义UILabel来实现url高亮

1、定义要用到的属性

 /*
 只要textStorage中的内容发生变化, 就可以通知layoutManager重新布局
 layoutManager重新布局需要知道绘制到什么地方, 所以layoutManager就会文textContainer绘制的区域
 */
 // 准们用于存储内容的
 // textStorage 中有 layoutManager
 private lazy var textStorage = NSTextStorage()
 // 专门用于管理布局
 // layoutManager 中有 textContainer
 private lazy var layoutManager = NSLayoutManager()
 // 专门用于指定绘制的区域
 private lazy var textContainer = NSTextContainer()
 override init(frame: CGRect) {
   super.init(frame: frame)
   setupSystem()
 }
 required init?(coder aDecoder: NSCoder) {
   super.init(coder: aDecoder)
   setupSystem()
 }
 private func setupSystem()
 {
   // 1.将layoutManager添加到textStorage
   textStorage.addLayoutManager(layoutManager)
   // 2.将textContainer添加到layoutManager
   layoutManager.addTextContainer(textContainer)
 }
 override func layoutSubviews() {
   super.layoutSubviews()
  // 3.指定区域
   textContainer.size = bounds.size
 }

2、重写label的text属性

override var text: String?
  {
  didSet{
 // 1.修改textStorage存储的内容
 textStorage.setAttributedString(NSAttributedString(string: text!))
 // 2.设置textStorage的属性
 textStorage.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, text!.characters.count))
 // 3.处理URL
 self.URLRegex()
 // 2.通知layoutManager重新布局
 setNeedsDisplay()
  }
}

3、匹配字符串

 func URLRegex()
 {
  // 1.创建一个正则表达式对象
  do{
   let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))
   let res = dataDetector.matchesInString(textStorage.string, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, textStorage.string.characters.count))
   // 4取出结果
   for checkingRes in res
   {
    let str = (textStorage.string as NSString).substringWithRange(checkingRes.range)
    let tempStr = NSMutableAttributedString(string: str)
//  tempStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, str.characters.count))
    tempStr.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(20), NSForegroundColorAttributeName: UIColor.redColor()], range: NSMakeRange(0, str.characters.count))
    textStorage.replaceCharactersInRange(checkingRes.range, withAttributedString: tempStr)
   }
  }catch
  {
   print(error)
  }
 }

4、重绘文字

 // 如果是UILabel调用setNeedsDisplay方法, 系统会促发drawTextInRect
override func drawTextInRect(rect: CGRect) {
 // 重绘
 // 字形 : 理解为一个小的UIView
 /*
 第一个参数: 指定绘制的范围
 第二个参数: 指定从什么位置开始绘制
 */
 layoutManager.drawGlyphsForGlyphRange(NSMakeRange(0, text!.characters.count), atPoint: CGPointZero)
}

获取label中URL的点击

如果要获取URL的点击,那么必须获取点击的范围

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
 // 1、获取手指点击的位置
 let touch = (touches as NSSet).anyObject()!
 let point = touch.locationInView(touch.view)
 print(point)
 // 2、获取URL区域
 // 注意: 没有办法直接设置UITextRange的范围
 let range = NSMakeRange(10, 20)
 // 只要设置selectedRange, 那么就相当于设置了selectedTextRange
 selectedRange = range
 // 给定指定的range, 返回range对应的字符串的rect
 // 返回数组的原因是因为文字可能换行
 let array = selectionRectsForRange(selectedTextRange!)
 for selectionRect in array {
   if CGRectContainsPoint(selectionRect.rect, point) {
    print("点击了URL")
   }
 }
}

以上内容就是小编跟大家介绍的swift中的正则表达式小结,希望大家喜欢。

(0)

相关推荐

  • Swift中的可变参数函数介绍

    可变参数函数指的是可以接受任意多个参数的函数,我们最熟悉的可能就是 NSString 的 -stringWithFormat:方法了.在 Objective-C 中,我们使用这个方法生成字符串的写法是这样的: 复制代码 代码如下: NSString *name = @"Tom"; NSDate *date = [NSDate date]; NSString *string = [NSString stringWithFormat:                 @"Hell

  • Swift的74个常用内置函数介绍

    Swift包含了74个内置函数,但在 The Swift Programming Langage 一书中只介绍了其中的7个,其它的都没有在文档中体现. 这篇文章列举出了所有的Swift库函数.文中所谓的 内置函数 是指无需引入任何模块(比如说Fundation等)即可以直接使用的函数. 下面先来看看7个在文档中提到的库函数: 下面列出一些很实用,但未在文档中体现的库函数: 复制代码 代码如下: //断言,参数如果为`true`则继续,否则抛出异常 //assert mentioned on pa

  • Swift网络请求库Alamofire使用详解

    前言 Alamofire是一个使用Swift开发的网络请求库,其开发团队是AFNetworking的原团队.它语法简洁,采用链式编程的思想,使用起来是相当的舒服.本质是基于NSURLSession进行封装.接下开我们就进入实战,开始学习Alamofire的使用. GET请求 常用的get请求示例以及请求结果 Alamofire.request("https://httpbin.org/get", method: .get, parameters: nil, encoding: URLE

  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift 文件可以在一个工程中并存,不管这个工程原本是基于 Objective-C 还是 Swift.你可以直接往现有工程中简单地添加另一种语言的源文件.这种自

  • swift中的正则表达式小结

    作为一门先进的编程语言,Swift 可以说吸收了众多其他先进语言的优点,但是有一点却是让人略微失望的,就是 Swift 至今为止并没有在语言层面上支持正则表达式. 正则表达式的用处: 判断给定的字符串是否符合某一种规则(专门用于操作字符串) - 电话号码,电子邮箱,URL... - 可以直接百度别人写好的正则 - 别人真的写好了,而且测试过了,我们可以直接用 - 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责 过滤筛选字符串,网络爬虫 替换文字,QQ聊天,图文混排 语法规则 使用过

  • 数据库中使用正则表达式小结

    本篇文章通过两个示例给大家介绍数据库中使用正则表达式小结,在此不多说,具体内容请看下文详解吧. 示例一: CREATE FUNCTION dbo.RegExpTest ( @source varchar(), --需要匹配的源字符串 @regexp varchar(), --正则表达式 @ignorecase bit = --是否区分大小写,默认为false ) RETURNS bit --返回结果-false,-true AS BEGIN --(成功)或非零数字(失败),是由OLE 自动化对象

  • swift中自定义正则表达式运算符=~详解

    什么是正则表达式? 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. swift 至今并没有在语言层面上支持正则表达式,可能在开发app时正则表达式使用的场景并不多. 封装 在 Cocoa 中我们可以使用 NSRegularExpression 来做

  • Swift中使用正则表达式的一些方法

    我使用Swift有段时间了,但最让人郁闷的是它还不能支持正则表达式. 先要说的是,这确实是门新语言,我在网站上有注释 a radar (rdar://17257306 for Apple folks). 如果你也认同这一观点,请支持. 我所说的正则表达式指的是这种(Ruby代码): if name =~ /ski$/ puts "#{name} is probably polish" end 如果要快速查询,可以使用=~操作符来返回匹配的结果.此外使用/pattern/syntax 形

  • 在Swift中如何使用正则表达式详解

    前言 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式(Regular expression, regex)允许我们在几秒钟内在成千上万文档间进行复杂检索与替换,自从诞生50多年来它依旧广泛使用. Swift虽然是一个新出的语言,但却不提供专门的处理正则的语法和类.所以我们只能使用古老的NSRegularExpression类进行

  • Swift中初始化init的方法小结

    前言 我们在深入初始化方法之前,不妨先再想想Swift中的初始化想要达到一种怎样的目的. 其实就是安全.在Objective-C中,init方法是非常不安全的:没有人能保证init只被调用一次,也没有人保证在初始化方法调用以后,实例的各个变量都完成初始化,甚至如果在初始化里使用属性进行设置的话,还可能会造成各种问题.虽然Apple也明确说明了不应该在init中使用属性来访问,但这并不是编译器强制的,因此还是会有很多开发者犯这样的错误. 所以Swift有了超级严格的初始化方法.一方面,Swift强

  • Python中正则表达式小结

    注意:本文基于Python2.4完成:如果看到不明白的词汇请记得百度谷歌或维基,whatever. 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正

  • swift中defer的实际应用小结

    看看苹果官方的介绍 用 defer 语句在即将离开当前代码块时执行一系列语句.该语句让你能执行一些必要的清理工作,不管是以何种方式离开当前代码块的--无论是由于抛出错误而离开,或是由于诸如 return.break 的语句.例如,你可以用 defer 语句来确保文件描述符得以关闭,以及手动分配的内存得以释放. defer 语句将代码的执行延迟到当前的作用域退出之前.该语句由 defer 关键字和要被延迟执行的语句组成.延迟执行的语句不能包含任何控制转移语句,例如 break.return 语句,

  • Hive中常用正则表达式的运用小结

    在实际的应用中,通常需要在一些复杂的.没有规律的字符串中提取数据,这时候就需要用到正则表达式了,这次讲一下hive的正则表达式. like 语法:A like B 说明:如果字符串A符合表达式B的正则语法,则为true,否则为flase.B中字符"_"表示任意单个字符,而字符"%"表示任意数量的字符. 例子:select 'AA123' like 'AA%'; 结果:true 例子:select 'AAbbbbcccc' like '_A%'; 结果:true rl

  • swift 3.0 正则表达式查找/替换字符的实现代码

    1.什么是正则表达式 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念. 正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 2.正则表达式的字符组成 普通字符[a~z].特殊字符(称为"元字符") 3.支持 几乎所有的程序设计语言都支持正则表达式,例如:OC,swift,java,c#,

随机推荐