swift中的正则表达式小结

 更新时间:2015年10月09日 10:41:38   投稿:mrr  
正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

作为一门先进的编程语言,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中的正则表达式小结,希望大家喜欢。

相关文章

  • 正则表达式之 贪婪与非贪婪模式详解(概述)

    正则表达式之 贪婪与非贪婪模式详解(概述)

    网上找到的贪婪与非贪婪模式详解,看了这一段基本明白贪婪与非贪婪模式的构成条件
    2012-10-10
  • 正则表达式不区分大小写以及解决思路的探索 .

    正则表达式不区分大小写以及解决思路的探索 .

    今天在写一个正则表达式的时候,因为字符有大小写的问题,多种大小写的组合,这时想到了用正则表达式
    2014-06-06
  • 取图片路径的正则

    取图片路径的正则

    取图片路径的正则...
    2006-07-07
  • 在VS2008中使用正则表达式进行查找和替换

    在VS2008中使用正则表达式进行查找和替换

    正则表达式是查找和替换文本模式的一种简洁而灵活的表示法。&nbsp;在“查找和替换”窗口中执行“快速查找”、“在文件中查找”、“快速替换”或“在文件中替换”操作时,可以在该窗口的“查找内容”和“替换为”字段中使用一组专用的正则表达式
    2016-05-05
  • 字符串过滤正则表达式的方法

    字符串过滤正则表达式的方法

    这篇文章主要介绍了字符串过滤正则表达式的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 正则中的圆括号()的用途详解

    正则中的圆括号()的用途详解

    正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本。今天我们就来详细探讨下正则中的圆括号()的用途,希望对大家学习正则有所帮助。
    2015-04-04
  • Java正则相关的Pattern和Matcher类及遇到的坑

    Java正则相关的Pattern和Matcher类及遇到的坑

    这篇文章主要介绍了Java正则相关的Pattern和Matcher类及遇到的坑,本文给大家提到了Matcher 里面的三个方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 正则表达式m修饰符(多行匹配)

    正则表达式m修饰符(多行匹配)

    m修饰符规定正则表达式可以执行多行匹配,在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个^和结尾$
    2016-12-12
  • php正则表达式取得内容所有链接的方法

    php正则表达式取得内容所有链接的方法

    这篇文章主要介绍了php正则表达式取得内容所有链接的方法,提供了两个不同的实现方法供大家灵活选择,需要的朋友可以参考下
    2014-12-12
  • JS正则表达式验证数字(非常全)

    JS正则表达式验证数字(非常全)

    正则表达式,又称规则表达式,在项目中经常会用到正则表达式,今天小编抽空给大家分享js正则表达式验证数字的方法,感兴趣的朋友参考下吧
    2016-12-12

最新评论