被忽視了的NSDataDetector

keywords

NSDataDetector NSRegularExpression NSTextCheckingResult

在日常開發(fā)場景中經(jīng)常會遇到,在一段文本中檢測一些半結(jié)構(gòu)化的信息,比如:日期、地址段、鏈接、電話號碼、交通信息、航班號、奇怪的格式化了的數(shù)字、甚至是相對的指示語等等。

如果這些需求在一個項目中出現(xiàn),在不知道NSDataDetector這個類之前,可能要頭皮發(fā)麻,之后開始自己編制一些正則,再加上國際化的需求,可能對編制好的正則需要大量的單元測試用例的介入。(估計好多小盆友要被這些東西整自閉了...)

幸運(yùn)的是,對于 Cocoa 開發(fā)者來說,有一個簡單的解決方案:NSDataDetector。

關(guān)于NSDataDetector

NSDataDetectorNSRegularExpression 的子類,而不只是一個 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ù),如地址或日期組件。

NSDataDetector1.jpg

NSDataDetector_print.jpg

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

NSDataDetector2.jpg

當(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

https://nshipster.com/nsdatadetector

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容