被忽視了的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

相關文章
相關標籤/搜索