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