NSRegularExpression

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)

示例所用正則表達式


enmerateMatchesInString:options:range:usingBlock

此方法為NSRegularExpression最基本的匹配方法井辆,其遍歷string的每個match,并對每個match進行block中指定的操作描孟,且可在任何執(zhí)行步驟停止(上例中即是在遍歷了100次之后退出的)

如果 NSMatchReportProgress或者NSMatchingReportCompletion均未設(shè)定驶睦,那么Block中的result參數(shù)絕不會為nil,即其中必定有一個有效的range匿醒,可查看NSMatchingOptions中相關(guān)定義

其他便捷的實用方法為

返回所有匹配子串?的array


匹配子串?dāng)?shù)組

所有匹配子串?dāng)?shù)目

匹配子串總數(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}

第一個匹配的range

find-and-replace方法?


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]的寫法,因為正則中 . 是不包含換行符的?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画株,一起剝皮案震驚了整個濱河市辆飘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓传,老刑警劉巖蜈项,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续挟,居然都是意外死亡紧卒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門诗祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跑芳,“玉大人轴总,你說我怎么就攤上這事〔└觯” “怎么了怀樟?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盆佣。 經(jīng)常有香客問我往堡,道長,這世上最難降的妖魔是什么共耍? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任投蝉,我火速辦了婚禮,結(jié)果婚禮上征堪,老公的妹妹穿的比我還像新娘。我一直安慰自己关拒,他們只是感情好佃蚜,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著着绊,像睡著了一般谐算。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上归露,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天洲脂,我揣著相機與錄音,去河邊找鬼剧包。 笑死恐锦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疆液。 我是一名探鬼主播一铅,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堕油!你這毒婦竟也來了潘飘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤掉缺,失蹤者是張志新(化名)和其女友劉穎卜录,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眶明,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡艰毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赘来。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片现喳。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯傲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗦篱,到底是詐尸還是另有隱情冰单,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布灸促,位于F島的核電站诫欠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浴栽。R本人自食惡果不足惜荒叼,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望典鸡。 院中可真熱鬧被廓,春花似錦、人聲如沸萝玷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球碉。三九已至蜓斧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睁冬,已是汗流浹背挎春。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留豆拨,地道東北人直奋。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像施禾,于是被迫代替她去往敵國和親帮碰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這篇文章其實是在學(xué)習(xí)正則表達式時網(wǎng)上一些資料的整合拾积,所以只能算是一個總結(jié)性文章殉挽,不是自己原創(chuàng),感謝各位的分享拓巧。參考...
    coder_zhengyi閱讀 2,969評論 2 6
  • 正則表達式又稱為正規(guī)表示法斯碌、規(guī)則表達式、常規(guī)表示法肛度,英語為Regular Expression傻唾,常簡寫為regex...
    pro648閱讀 5,401評論 1 11
  • iOS 中:正則表達式,又稱正規(guī)表示法、常規(guī)表示法冠骄。(英語:Regular Expression伪煤,在代碼中常簡寫為...
    草原烈鷹閱讀 3,729評論 1 8
  • 學(xué)習(xí)iOS自帶的正則表達式:主要有四個方法 - (NSArray *)matchesInString:(NSStr...
    icc_tips閱讀 2,472評論 1 2
  • 之前被一句話驚到了,”人為什么不擅長談戀愛凛辣?”確實如此抱既,除去少部分在電影電視里面看到的情圣,能同時跟好多個女孩交往...
    寒陽198閱讀 793評論 0 1