swift中的t正则表达式

  • 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

正则表达式的用处:

    1. 判断给定的字符串是否符合某一种规则(专门用于操作字符串)
    • 电话号码,电子邮箱,URL...
    • 可以直接百度别人写好的正则
    • 别人真的写好了,而且测试过了,我们可以直接用
    • 要写出没有漏洞正则判断,需要大量的测试,通常最终结果非常负责
    1. 过滤筛选字符串,网络爬虫
    1. 替换文字,QQ聊天,图文混排

语法规则

  • 1> 集合
	[xyz]		字符集合(x/y或z)
[a-z] 字符范围
[a-zA-Z]
[^xyz] 负值字符集合 (任何字符, 除了xyz)
[^a-z] 负值字符范围
[a-d][m-p] 并集(a到d 或 m到p)
  • 2> 常用元字符
	.			匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字 [a-zA-Z_0-9]
\s 匹配任意的空白符(空格、TAB\t、回车\r \n)
\d 匹配数字 [0-9]
^ 匹配字符串的开始
$ 匹配字符串的结束
\b 匹配单词的开始或结束
  • 2> 常用反义符
	\W          匹配任意不是字母,数字,下划线,汉字的字符[^\w]
\S 匹配任意不是空白符的字符 [^\s]
\D 匹配任意非数字的字符[^0-9]
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
  • 4> 常用限定符
	*			重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次,
  • 5> 贪婪和懒惰
	*?			重复任意次,但尽可能少重复
*+ 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

使用过程

  • 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中的正则表达式的更多相关文章

  1. 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;

    1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...

  2. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

  3. 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON

    项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...

  4. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  5. 在Swift中实现单例方法

    在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...

  6. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  7. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

  8. PHP中有关正则表达式的函数集锦

    之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...

  9. swift 中指针的使用UnsafeMutablePointer

    在swift中已经弱化了指针的使用,可以这么使用 let s: NSRange = NSMakeRange(, ) let at = UnsafeMutablePointer<NSRange&g ...

随机推荐

  1. ARM实验3 ——串口实验

    uart串口实验 实验内容: 编写UART模块程序,通过串口将信息打印到终端. 实验目的: 熟悉开发环境的使用. 掌握exynos4412处理器的UART功能. 实验平台: FS4412开发板,ecl ...

  2. 使用dao时,如何同时使用动态表名和过滤字段?

    使用dao时,如何同时使用动态表名和过滤字段?  发布于 630天前  作者 wukonggg  316 次浏览  复制  上一个帖子  下一个帖子  标签: 无 如题.求样例代码 1 回复 wend ...

  3. UVA 12345 Dynamic len(set(a[LR]))

    题意:询问区间唯一元素个数,单点修改. 分析: 借助Unique snowflakes, Can you answer these queries II的思想,唯一性可以借助元素上一次出现的位置来判断 ...

  4. [Linux发行版] 常见Linux系统下载(转)

    本专题页汇总最受欢迎的Linux发行版基本介绍和下载地址,如果您是一位刚接触Linux的新手,这里的介绍可能对您有所帮助,如果您是以为Linux使用前辈,也可以在评论处留下您宝贵意见和经验,以便让更多 ...

  5. IDEA的常用操作(快捷键)

    IDEA的常用操作(快捷键) Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt ...

  6. 1.5配置NetBackup数据库备份策略(nbu策略catalog)

    1.5配置NetBackup数据库备份策略 建议定期备份NetBackup的索引数据库Catalog,以确保故障时的有效恢复.从Javaconsole可以进入备份NetBackup内部数据库配置窗口, ...

  7. 【转】android gravity属性 和 weight属性

    有点忘记这两个属性了,复习一下. 来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <Linea ...

  8. 通过ODBC接口访问人大金仓数据库

      国产化软件和国产化芯片的窘境一样,一方面市场已经存在性能优越的同类软件,成本很低,但小众的国产化软件不仅需要高价买入版权,并且软件开发维护成本高:另一方面,国产软件目前普遍难用,性能不稳定,Bug ...

  9. C语言中volatile关键字的作用[转]

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  10. Ubuntu 12.04 the system is running in low-graphics mode

    1.出现问题如图所示: 2.解决方案: Ctrl + Alt + F1 df -h 输入密码,到了这一步,也是可以使用terminal,那么没有图形界面也是可以的 cd /etc/X11 sudo c ...