NSRegularExpression用于將正則表達式用于匹配Unicode字符串,其實例不可更改纯续,且?guī)в谐跏蓟瘯r所設(shè)定的正則表達式模式以及多個選項標(biāo)識位较木。正則語法遵循ICU標(biāo)準(zhǔn)。
基本的NSRegularExpression匹配方法
一個Block遍歷方法堤结,即調(diào)用的時候指定一個Block,進而在執(zhí)行時凫佛,會對目標(biāo)string上找到的每個匹配的子串執(zhí)行此Block:(以下所給出的例子均使用正則表達式 \\b(a|b)(c|d)\\b)
此方法為NSRegularExpression最基本的匹配方法井辆,其遍歷string的每個match,并對每個match進行block中指定的操作描孟,且可在任何執(zhí)行步驟停止(上例中即是在遍歷了100次之后退出的)
如果 NSMatchReportProgress或者NSMatchingReportCompletion均未設(shè)定驶睦,那么Block中的result參數(shù)絕不會為nil,即其中必定有一個有效的range匿醒,可查看NSMatchingOptions中相關(guān)定義
其他便捷的實用方法為
返回所有匹配子串?的array
所有匹配子串?dāng)?shù)目
第一個匹配的子串?
第一個匹配的range
由于存在有正則表達式匹配到一個空串的情況场航,所以最可靠的方式是將匹配結(jié)果與{NSNotFound,0}比較以判定是否匹配成功。
而對于匹配中有多個(比如兩個)捕獲的group的情況廉羔,如所用正則示例中含兩個group, 對應(yīng)于其中的兩對括號溉痢,一個對應(yīng)第一個字母,另一個對應(yīng)第二個字母蜜另。如果不想僅僅獲取整體的匹配串适室,而想獲取單個匹配更多的細(xì)節(jié)信息,則可以獲取給定單個匹配的NSTextCheckingResult對象举瑰,其range屬性包含所有此匹配中捕獲的所有g(shù)roups的信息捣辆。第一個捕獲的group通過[result rangeAtIndex:1]獲得,其后類推此迅, [result range]相當(dāng)于[result rangeAtIndex:0]
如果result非nil, 那么 [result range]一定是有效的range汽畴。然而旧巾,有些正則表達式中有些group可能不會出現(xiàn)在特定的match中,如果未出現(xiàn)忍些,則對應(yīng)idx的 [result rangeAtIndex:idx]將會返回{NSFound,0}
find-and-replace方法?
此方法返回replace過后的string, 但其實還有一個對應(yīng)的方法可以直接在mutablestring上進行查找替換鲁猩。template指定了怎樣替換每個match, 其中$0代表整體的匹配range的串,$1代表第一個捕獲的group的串罢坝,等等廓握。
附注
每個單獨的匹配是由NSTextCheckingResult類實例所描述的,其包含整體的匹配range的信息(通過range屬性), 每個捕獲的Group的range(通過rangeAtIndex:方法)嘁酿。對于基本的NSRegularExpression對象隙券,這些匹配結(jié)果是 NSTextCheckingTypeRegularExpression類型,NSRegularExpression子類型可以使用其他類型闹司。
所以要獲取某個字符串匹配中的某個group娱仔,需要使用 [NSTextCheckingResult rangeAtIndex:groupindex] (0 總是代表整個匹配的range)
NSRegularExpression使用過程中的思考
上面這些當(dāng)然只是一些API級別的東東,當(dāng)不得真的游桩,實際你在使用的時候遇到的問題自然是多種多樣的牲迫,比如你可能會問題,如果描述正則表達式的字符串編譯成功了借卧,可為什么它沒有按照預(yù)定的效果匹配出想要的字符串盹憎。先別急,編譯通過只是第一步谓娃,生成可用的NSRegularExpression對象才是第一要務(wù)脚乡,編譯成功也可能產(chǎn)生初始化出來的NSRegularExpression為空的情況
大家想必也知道要想表示反斜杠一定要使用4個反斜杠才能讓正則君明白你拿著砍刀在他前面比劃4遍是為了讓它知道你想**它( i.e. \),蘋果諸神們用的是ICU的正則規(guī)則
用正則表達式測內(nèi)存泄漏
在block中使用self或者_property這類會對self產(chǎn)生循環(huán)引用的寫法無疑會產(chǎn)生內(nèi)存泄漏滨达,可以簡單地通過xcode的正則表達式查找來完成對這類低級錯誤的修復(fù)
\^[^\{]*\{[^\}]*[\W]self[^\}]*\}
以上用于匹配block中含有self引用的情況奶稠,一個小的需要注意的點是,如果想匹配包含換行符的字符捡遍,需要使用[\s\S]或者[\w\W]锌订、[\d\D]的寫法,因為正則中 . 是不包含換行符的?