正則表達式的使用

參考鏈接:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

特殊字符-限定符

*: 表示前面的字符可以出現(xiàn)0次或多次
+: 表示前面的字符至少出現(xiàn)一次
摔吏?: 表示前面的字符最多出現(xiàn)一次
押赊?: 表示前面的字符最多出現(xiàn)一次
{n}: n 是一個非負整數(shù)肖揣。匹配確定的 n 次
{n,}: n 是一個非負整數(shù)肚豺。至少匹配n 次
{n,m}: m 和 n 均為非負整數(shù),其中n <= m翩概。最少匹配 n 次且最多匹配 m 次实幕。

NSArray *data = @[
    @"abdef",
    @"abcdef",
    @"abccdef",
    @"abcccdef",
    @"abcgdef"
];
NSString *regeStr = @"abc*def";

NSPredicate* pre_text = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regeStr];

for (NSString *text in data) {
    if ([pre_text evaluateWithObject:text]) {
        NSLog(@"%@ 匹配正確",text);
    } else {
        NSLog(@"%@ 匹配錯誤",text);
    }
}

abc*def 的輸出結(jié)果:
abdef 匹配正確
abcdef 匹配正確
abccdef 匹配正確
abcccdef 匹配正確
abcgdef 匹配錯誤

abc+def 的輸出結(jié)果:
abdef 匹配錯誤
abcdef 匹配正確
abccdef 匹配正確
abcccdef 匹配正確
abcgdef 匹配錯誤

abc?def 的輸出結(jié)果:
abdef 匹配正確
abcdef 匹配正確
abccdef 匹配錯誤
abcccdef 匹配錯誤
abcgdef 匹配錯誤

abc{2}def 的輸出結(jié)果:
abdef 匹配錯誤
abcdef 匹配錯誤
abccdef 匹配正確
abcccdef 匹配錯誤
abcgdef 匹配錯誤

abc{2,}def 的輸出結(jié)果:
abdef 匹配錯誤
abcdef 匹配錯誤
abccdef 匹配正確
abcccdef 匹配正確
abcgdef 匹配錯誤

abc{1,2}def 的輸出結(jié)果:
abdef 匹配錯誤
abcdef 匹配正確
abccdef 匹配正確
abcccdef 匹配錯誤
abcgdef 匹配錯誤

區(qū)間符

[],(),{}:都是表達式的意思卸奉,如果要匹配單獨的括號字符需要在前面加\空厌,比如\[等。
():是為了提取匹配字符串的银酬,表達式中有幾個()就有幾個相應(yīng)的匹配字符串
[]:是定義匹配的字符范圍嘲更,比如[1-9],相當于匹配1到9之間的一個數(shù)。
{}:是一個區(qū)間揩瞪,就像上面的{n,m}匹配n到m個數(shù)赋朦。

NSArray *data = @[
    @"0",
    @"1",
    @"12",
    @"123"
];
NSString *regeStr = @"[1-9]";

NSPredicate* pre_text = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regeStr];

for (NSString *text in data) {
    if ([pre_text evaluateWithObject:text]) {
        NSLog(@"%@ 匹配正確",text);
    } else {
        NSLog(@"%@ 匹配錯誤",text);
    }
}

regeStr = [1-9] 輸出結(jié)果:
// 匹配1到9的一位數(shù)
0 匹配錯誤
1 匹配正確
12 匹配錯誤
123 匹配錯誤

regeStr = [1-9]* 輸出結(jié)果:
// 匹配多位數(shù)要求不包含有0
0 匹配錯誤
1 匹配正確
12 匹配正確
123 匹配正確

regeStr = [1-9][1-9] 輸出結(jié)果:
// 匹配兩位數(shù)要求不包含有0
0 匹配錯誤
1 匹配錯誤
12 匹配正確
123 匹配錯誤

regeStr = [0-9][1-9]* 輸出結(jié)果:
// 匹配多位數(shù),第二位開始不為0
0 匹配錯誤
1 匹配正確
12 匹配正確
123 匹配正確
1230 匹配錯誤
0123 匹配正確

regeStr = [0-9][1-9]{1,2} 輸出結(jié)果:
// 匹配二位數(shù)或者三位數(shù)李破,第二位開始不為0
0 匹配錯誤
1 匹配錯誤
12 匹配正確
123 匹配正確
1230 匹配錯誤
0123 匹配錯誤
120 匹配錯誤

.:點號表示匹配任意數(shù)
[0-9]:表示匹配0到9的數(shù)宠哄。
[a-z]:表示匹配a到z的小寫字母。
[A-Z]:表示匹配A到Z的大寫字母嗤攻。
[^A-Z]:表示匹配非A到Z的其他字符毛嫉。
[^ABC]:表示匹配非ABC的其他字符。
[a-zA-Z]:表示匹配所有字母妇菱。
[0-9\.\-]:表示匹配所有數(shù)字承粤,點號暴区,減號
\d:表示匹配0到9的數(shù)等價于[0-9]
\D:表示匹配非0到9的數(shù)等價于[^0-9]辛臊。
\w:匹配字母仙粱、數(shù)字、下劃線彻舰。等價于[A-Za-z0-9_]伐割。
\W:匹配非字母、數(shù)字刃唤、下劃線隔心。等價于[^A-Za-z0-9_]
其他自己理解

NSString *text = @"哈哈哈哈<h1>HELLO WORD IOS 開發(fā)</h1>啦啦啦<p>百度一下</p>結(jié)束";
NSString *regeStr = @"[a-z0-9A-Z]";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regeStr options:NSRegularExpressionAllowCommentsAndWhitespace error:nil];
NSArray *result = [regex matchesInString:text options:NSMatchingReportCompletion range:NSMakeRange(0, text.length)];

NSMutableString *res = [[NSMutableString alloc]init];
for (NSTextCheckingResult *item in result) {
    NSString *item_text = [text substringWithRange:[item rangeAtIndex:0]];
    if (![item_text isEqualToString:@""]) {
        [res appendString:[NSString stringWithFormat:@"%@ ",item_text]];
    }
}
NSLog(@"%@",res);

[a-z0-9A-Z] 輸出所有匹配的結(jié)果
// 輸出包含大寫小寫和數(shù)字的字符
 h 1 H E L L O W O R D I O S h 1 p p

[a-z0-9A-Z]* 輸出所有匹配的結(jié)果
// 輸出包含大寫小寫和數(shù)字的字符串
h1 HELLO WORD IOS h1 p p

*透揣、+ 限定符都是貪婪的济炎,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現(xiàn)非貪婪或最小匹配辐真。

比如還是上面的代碼须尚,我們改變一下正則表達式:

<.*> 輸出所有匹配的結(jié)果
// 輸出以`<`開頭,`>`結(jié)尾的字符串侍咱,會匹配第一個`<`和最后一個`>`
<h1>HELLO WORD IOS 開發(fā)</h1>啦啦啦<p>百度一下</p>

<.*?> 輸出所有匹配的結(jié)果
// 輸出以`<`開頭耐床,`>`結(jié)尾的字符串,會匹配第一個`<`和前面最近的一個`>`楔脯,最后就相當于匹配所有的標簽
<h1> </h1> <p> </p>

定位符

^:匹配輸入字符串開始的位置(當在[^],方括號中撩轰,表示非,排除的意思)
$:匹配輸入字符串結(jié)束的位置
\b:匹配一個單詞邊界昧廷,即字與空格間的位置堪嫂。
\B:非單詞邊界匹配。

不能將限定符與定位符一起使用木柬。由于在緊靠換行或者單詞邊界的前面或后面不能有一個以上位置皆串,因此不允許諸如 ^* 之類的表達式。
若要匹配一行文本開始處的文本眉枕,請在正則表達式的開始使用 ^ 字符恶复。不要將 ^ 的這種用法與中括號表達式內(nèi)的用法混淆。
若要匹配一行文本的結(jié)束處的文本速挑,請在正則表達式的結(jié)束處使用 $ 字符谤牡。
若要在搜索章節(jié)標題時使用定位點,下面的正則表達式匹配一個章節(jié)標題姥宝,該標題只包含兩個尾隨數(shù)字翅萤,并且出現(xiàn)在行首

^$:同時使用則表示精準查找:^once$ 表示查找once的單詞

text = @"once an cd"
^once 輸出結(jié)果
查找以once開頭的字符串

text = @"Idks dvdw DDmD IDSc"

\\b[a-z0-9A-Z]*\\b 輸出所有匹配的結(jié)果
// 輸出將字母按隔斷分開字符串
Idks dvdw DDmD IDSc 

?=腊满、?!断序、?<= 流纹、?<!?: 用于限定它前后的表達式违诗,不能單獨使用漱凝,本身沒有作用。

a(?=b) 匹配后面有 b 的 a诸迟。
a(?!b) 匹配后面沒有 b 的 a茸炒。
(?<=a) b 匹配前面有 a 的 b。
(?<!a) b 匹配前面沒有 a 的 b阵苇。
industr(?:y|ies) 或運算industry|industries兩個中的一個

運算符優(yōu)先級

優(yōu)先級由高到低:轉(zhuǎn)義符 > 圓括號和方括號 > 限定符 > 其他 > "或" 壁公,同級則從左到右
轉(zhuǎn)義符: \
圓括號和方括號: (), (?:), (?=), []
限定符: *, +, ?, {n}, {n,}, {n,m}
其他:^, $, \任何元字符、任何字符 定位點和序列(即:位置和順序)
替換绅项,"或"操作:|

實戰(zhàn)

iOS中轉(zhuǎn)義字符可以兩個\\紊册,也可\

  • 匹配所有整數(shù):^\\-?[0-9]{1,}$

  • 匹配所有正整數(shù):^[1-9][0-9]{0,}$

  • 匹配所有浮點數(shù):^[-]?[0-9]+(\\.[0-9]+)?$
    但是沒有去除前面的0,即-0123.9快耿,-123.9囊陡。如果要去掉浮點數(shù)前面的0,更換表達式^[-]?([0-9]|[1-9][0-9]+)(\\.[0-9]+)?$

  • 獲取所有html標簽 <\\/?.+?\\/?><.+?>
    *?表示匹配最近的一個>掀亥,即用<>包括里面的字符串

NSString *text = @"哈哈哈哈<h1>HELLO WORD IOS 開發(fā)</h1>啦啦啦<p>百度一下</p>結(jié)束";
NSString *regeStr = @"<\\/?.+?\\/?>";
NSRegularExpression *regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"<[^>]*>|\n"
                                        options:0
                                         error:nil];
text=[regularExpretion stringByReplacingMatchesInString:text options:NSMatchingReportProgress range:NSMakeRange(0, text.length) withTemplate:@""];
// 將所有標簽都變成空撞反,這樣就得到無標簽的字符串。
NSLog(@"%@",text);
  • 獲取所有標簽搪花,除了a或p的標簽:<[^a|p|A|P|>]+>
    同樣也是不夠嚴謹遏片,標簽之間的空格要去掉。

  • 獲取p標簽及內(nèi)容:<\\s*[p|P].*?(<\\s*\\/\\s*[p|P]\\s*>),加上\\s*撮竿,同樣是為了處理空格的作用吮便。

  • 獲取p標簽的內(nèi)容,不包括p標簽:(?<=(<[p|P]>))(.*?(?=(</[p|P]>)))
    ?<=的用法幢踏,上面有講過髓需。(?<=(<p>)),意思是獲取<p>標簽后面的數(shù)據(jù)(.*?(?=(</p>)))的意思是獲取</p>標簽前面的數(shù)據(jù)惑折。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末授账,一起剝皮案震驚了整個濱河市枯跑,隨后出現(xiàn)的幾起案子惨驶,更是在濱河造成了極大的恐慌,老刑警劉巖敛助,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗卜,死亡現(xiàn)場離奇詭異,居然都是意外死亡纳击,警方通過查閱死者的電腦和手機续扔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門攻臀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纱昧,你說我怎么就攤上這事刨啸。” “怎么了识脆?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵设联,是天一觀的道長。 經(jīng)常有香客問我灼捂,道長离例,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任悉稠,我火速辦了婚禮宫蛆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘的猛。我一直安慰自己耀盗,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布衰絮。 她就那樣靜靜地躺著袍冷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猫牡。 梳的紋絲不亂的頭發(fā)上胡诗,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音淌友,去河邊找鬼煌恢。 笑死,一個胖子當著我的面吹牛震庭,可吹牛的內(nèi)容都是我干的瑰抵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼器联,長吁一口氣:“原來是場噩夢啊……” “哼二汛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拨拓,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肴颊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渣磷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿着,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竟宋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提完。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丘侠,靈堂內(nèi)的尸體忽然破棺而出徒欣,到底是詐尸還是另有隱情,我是刑警寧澤蜗字,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布帚称,位于F島的核電站,受9級特大地震影響秽澳,放射性物質(zhì)發(fā)生泄漏闯睹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一担神、第九天 我趴在偏房一處隱蔽的房頂上張望楼吃。 院中可真熱鬧,春花似錦妄讯、人聲如沸孩锡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躬窜。三九已至,卻和暖如春炕置,著一層夾襖步出監(jiān)牢的瞬間荣挨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工朴摊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留默垄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓甚纲,卻偏偏與公主長得像口锭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子介杆,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345