NSDataDetector
NSRegularExpression
NSTextCheckingResult
在平常开发场景中常常会遇到,在一段文本中检测一些半结构化的信息,好比:日期、地址段、连接、电话号码、交通讯息、航班号、奇怪的格式化了的数字、甚至是相对的指示语等等。git
若是这些需求在一个项目中出现,在不知道NSDataDetector
这个类以前,可能要头皮发麻,以后开始本身编制一些正则,再加上国际化的需求,可能对编制好的正则须要大量的单元测试用例的介入。(估计好多小盆友要被这些东西整自闭了...)github
幸运的是,对于 Cocoa 开发者来讲,有一个简单的解决方案:NSDataDetector
。正则表达式
NSDataDetector
是 NSRegularExpression 的子类,而不仅是一个 ICU
的模式匹配,它能够检测半结构化的信息:日期,地址,连接,电话号码和交通讯息。express
它以惊人的准确度完成这一切。NSDataDetector
能够匹配航班号,地址段,奇怪的格式化了的数字,甚至是相对的指示语,如 “下周六五点”。app
你能够把它当作是一个有着复杂的使人难以置信的正则表达式匹配,能够从天然语言提取信息(尽管实际的实现细节可能比这个复杂得多)。性能
NSDataDetector
对象用一个须要检查的信息的位掩码类型来初始化,而后传入一个须要匹配的字符串。像 NSRegularExpression
同样,在一个字符串中找到的每一个匹配是用 NSTextCheckingResult 来表示的,它有诸如字符范围和匹配类型的详细信息。然而,NSDataDetector
的特定类型也能够包含元数据,如地址或日期组件。
单元测试
固然你也能够结合 YYKit 中的YYLabel
进行文本的高亮展现,而且添加点击事件(如下是我项目中须要匹配文本中的手机号码):测试
当初始化 NSDataDetector 的时候,确保只指定你感兴趣的类型。每当增长一个须要检查的类型,随着而来的是不小的性能损失为代价。url
NSDataDetector 的各类 NSTextCheckingTypes 匹配,及其相关属性表:spa
类型 | 属性 |
---|---|
NSTextCheckingTypeDate | 1. date |
2. duration | |
3. timeZon | |
NSTextCheckingTypeAddress | 1.NSTextCheckingNameKey |
2. NSTextCheckingJobTitleKey | |
3.NSTextCheckingOrganizationKey | |
4.NSTextCheckingStreetKey | |
5.NSTextCheckingCityKey | |
6.NSTextCheckingStateKey | |
7.NSTextCheckingZIPKey | |
8.NSTextCheckingCountryKey | |
9.NSTextCheckingPhoneKey | |
NSTextCheckingTypeLink | url |
NSTextCheckingTypePhoneNumber | phoneNumber |
NSTextCheckingTypeTransitInformation | 1.NSTextCheckingAirlineKey |
2.NSTextCheckingFlightKey |
其余的一些注意事项能够自行参考 Mattt 的文章NSDataDetector自行进行查阅。
好了,你们能够进行尝试一下,在你的应用程序里充分利用 NSDataDetector
解锁那些已经隐藏在众目睽睽下的结构化信息吧。
参考自: developer.apple.com/documentati…
做者:lucky_lee连接:https://www.jianshu.com/p/91daa300da26