前言
許久未寫簡書了,今日寫寫自己多日遇到的正則表達(dá)式所踩過的坑
附錄
附上璞大大的正則表達(dá)式說明
iOS常用正則表達(dá)式
/**
* 正則表達(dá)式簡單說明
* 語法:
. 匹配除換行符以外的任意字符
\\w 匹配字母或數(shù)字或下劃線或漢字
\\s 匹配任意的空白符
\\d 匹配數(shù)字
\\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
\\W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符
\\S 匹配任意不是空白符的字符
\\D 匹配任意非數(shù)字的字符
\\B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou這幾個(gè)字母以外的任意字符
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)
\\a 報(bào)警字符(打印它的效果是電腦嘀一聲)
\\b 通常是單詞分界位置,但如果在字符類里使用代表退格
\\t 制表符,Tab
\\r 回車
\\v 豎向制表符
\\f 換頁符
\\n 換行符
\\e Escape
\\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\\cN ASCII控制字符。比如\\cC代表Ctrl+C
\\A 字符串開頭(類似^,但不受處理多行選項(xiàng)的影響)
\\Z 字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)
\\z 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)
\\G 當(dāng)前搜索的開頭
\\p{name} Unicode中命名為name的字符類,例如\\p{IsGreek}
(?>exp) 貪婪子表達(dá)式
(?<x>-<y>exp) 平衡組
(?im-nsx:exp) 在子表達(dá)式exp中改變處理選項(xiàng)
(?im-nsx) 為表達(dá)式后面的部分改變處理選項(xiàng)
(?(exp)yes|no) 把exp當(dāng)作零寬正向先行斷言,如果在這個(gè)位置能匹配,使用yes作為此組的表達(dá)式;否則使用no
(?(exp)yes) 同上,只是使用空表達(dá)式作為no
(?(name)yes|no) 如果命名為name的組捕獲到了內(nèi)容,使用yes作為表達(dá)式;否則使用no
(?(name)yes) 同上,只是使用空表達(dá)式作為no
捕獲
(exp) 匹配exp,并捕獲文本到自動命名的組里
(?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
零寬斷言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋
(?#comment) 這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀
*/
案例解析
- 匹配純字母0~無窮多個(gè)
@"[a-zA-Z]*";
- 匹配純字母1~無窮多個(gè)
@"[a-zA-Z]+";
- 匹配純數(shù)字1~無窮多個(gè)
@"[0-9]+";
- 匹配字母數(shù)字特定個(gè)數(shù),比如為4個(gè)
@"[a-zA-Z0-9]{4}";
- 匹配字母數(shù)字特定個(gè)數(shù),比如為4~9個(gè)
@"[a-zA-Z0-9]{4,9}";
- 匹配所有空白符
@"[\\s]*";
- 匹配非空字符
@"[\\S]*";
- 匹配所有內(nèi)容
@"[\\s\\S]*";
- 匹配單詞、數(shù)字、下劃線、空白字符若干個(gè)
@"[\\sa-zA-Z0-9_]*";
- 匹配某個(gè)指定字符,如A
@"[A]{1}";
- 匹配特定單詞,如:School
@"[S]{1}[c]{1}[h]{1}[o]{1}[o]{1}[l]{1}";
//或者如下,當(dāng)個(gè)數(shù)為1的時(shí)候可以省略
@"[S][c][h][o][o][l]";
//或者直接寫出
@"School";
- 匹配除此字符之外的任意字符,如:}
@"[^\\}]*";
- 匹配漢字
@"[\u4e00-\u9fa5]*;
- 匹配特殊字符
@"[0-9a-zA-Z\u4e00-\u9fa5\\.\\*\\)\\(\\+\\$\\[\\?\\\\\\^\\{\\|\\]\\}%%%@\'\",?!?、-【】·!_——=:;;<>《》‘’“”!#~]+";
*釋義
@"[\\s]*[-\\+]{1}[a-zA-Z0-9_\\s\\*:\\(\\)]+[\\{;]";
(匹配0~多個(gè)空白符)+(匹配一個(gè)-或者+)+(匹配1個(gè)及以上的字母、數(shù)字、下劃線、空白符、星號符號、冒號、左小括號、右小括號)+(1個(gè)左大括號、分號)
注意:以上正則表達(dá)式中有特別含義的符號則需要用反斜杠來轉(zhuǎn)義,但是iOS中需要對反斜杠再次轉(zhuǎn)義,所以會看到雙斜杠
測試工具
以上?。?!
問題探討
如何排除掉字符串呢?例如我要匹配非abc字符串的所有內(nèi)容,并不是非a|b|c字符的所有內(nèi)容,是匹配整個(gè)串,若有知道的可以留言~
參考:
利用正則表達(dá)式排除特定字符串
正則表達(dá)式匹配非需要匹配的字符串(標(biāo)題自己都繞暈了)
正則表達(dá)式匹配"非",以及"非"字符串的匹配

呆萌.png