被忽视了的NSDataDetector

keywords

NSDataDetector NSRegularExpression NSTextCheckingResult

在平常开发场景中常常会遇到,在一段文本中检测一些半结构化的信息,好比:日期、地址段、连接、电话号码、交通讯息、航班号、奇怪的格式化了的数字、甚至是相对的指示语等等git

若是这些需求在一个项目中出现,在不知道NSDataDetector这个类以前,可能要头皮发麻,以后开始本身编制一些正则,再加上国际化的需求,可能对编制好的正则须要大量的单元测试用例的介入。(估计好多小盆友要被这些东西整自闭了...)github

幸运的是,对于 Cocoa 开发者来讲,有一个简单的解决方案:NSDataDetector正则表达式

关于NSDataDetector

NSDataDetectorNSRegularExpression 的子类,而不仅是一个 ICU 的模式匹配,它能够检测半结构化的信息:日期,地址,连接,电话号码和交通讯息express

它以惊人的准确度完成这一切。NSDataDetector 能够匹配航班号,地址段,奇怪的格式化了的数字,甚至是相对的指示语,如 “下周六五点”app

你能够把它当作是一个有着复杂的使人难以置信的正则表达式匹配,能够从天然语言提取信息(尽管实际的实现细节可能比这个复杂得多)。性能

NSDataDetector 对象用一个须要检查的信息的位掩码类型来初始化,而后传入一个须要匹配的字符串。像 NSRegularExpression 同样,在一个字符串中找到的每一个匹配是用 NSTextCheckingResult 来表示的,它有诸如字符范围和匹配类型的详细信息。然而,NSDataDetector 的特定类型也能够包含元数据,如地址或日期组件。
单元测试

NSDataDetector1.jpg

NSDataDetector_print.jpg

固然你也能够结合 YYKit 中的YYLabel进行文本的高亮展现,而且添加点击事件(如下是我项目中须要匹配文本中的手机号码):测试

NSDataDetector2.jpg

当初始化 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…

developer.apple.com/documentati…

nshipster.com/nsdatadetec…



做者:lucky_lee

连接:https://www.jianshu.com/p/91daa300da26

相关文章
相关标签/搜索