參考鏈接: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ù)惑折。