keywords
NSDataDetector NSRegularExpression NSTextCheckingResult
在日常開發(fā)場景中經(jīng)常會遇到,在一段文本中檢測一些半結(jié)構(gòu)化的信息,比如:日期、地址段、鏈接、電話號碼、交通信息、航班號、奇怪的格式化了的數(shù)字、甚至是相對的指示語等等。
如果這些需求在一個項目中出現(xiàn),在不知道NSDataDetector這個類之前,可能要頭皮發(fā)麻,之后開始自己編制一些正則,再加上國際化的需求,可能對編制好的正則需要大量的單元測試用例的介入。(估計好多小盆友要被這些東西整自閉了...)
幸運(yùn)的是,對于 Cocoa 開發(fā)者來說,有一個簡單的解決方案:NSDataDetector。
關(guān)于NSDataDetector
NSDataDetector 是 NSRegularExpression 的子類,而不只是一個 ICU 的模式匹配,它可以檢測半結(jié)構(gòu)化的信息:日期,地址,鏈接,電話號碼和交通信息。
它以驚人的準(zhǔn)確度完成這一切。NSDataDetector 可以匹配航班號,地址段,奇怪的格式化了的數(shù)字,甚至是相對的指示語,如 “下周六五點(diǎn)”。
你可以把它看成是一個有著復(fù)雜的令人難以置信的正則表達(dá)式匹配,可以從自然語言提取信息(盡管實(shí)際的實(shí)現(xiàn)細(xì)節(jié)可能比這個復(fù)雜得多)。
NSDataDetector 對象用一個需要檢查的信息的位掩碼類型來初始化,然后傳入一個需要匹配的字符串。像 NSRegularExpression 一樣,在一個字符串中找到的每個匹配是用 NSTextCheckingResult 來表示的,它有諸如字符范圍和匹配類型的詳細(xì)信息。然而,NSDataDetector 的特定類型也可以包含元數(shù)據(jù),如地址或日期組件。


當(dāng)然你也可以結(jié)合 YYKit 中的YYLabel進(jìn)行文本的高亮展示,并且添加點(diǎn)擊事件(以下是我項目中需要匹配文本中的手機(jī)號碼):

當(dāng)初始化 NSDataDetector 的時候,確保只指定你感興趣的類型。每當(dāng)增加一個需要檢查的類型,隨著而來的是不小的性能損失為代價。
數(shù)據(jù)檢測器匹配類型
NSDataDetector 的各種 NSTextCheckingTypes 匹配,及其相關(guān)屬性表:
| 類型 | 屬性 |
|---|---|
| NSTextCheckingTypeDate | 1. date |
| 2. duration | |
| 3. timeZone | |
| 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自行進(jìn)行查閱。
好了,大家可以進(jìn)行嘗試一下,在你的應(yīng)用程序里充分利用 NSDataDetector 解鎖那些已經(jīng)隱藏在眾目睽睽下的結(jié)構(gòu)化信息吧。
參考自: https://developer.apple.com/documentation/foundation/nsregularexpression
https://developer.apple.com/documentation/foundation/nstextcheckingresult