正則表達式快速入門
首先簡單介紹下正則表達式:
? ? ? 在編寫處理字符串的程序或網頁時,經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。
下面就看看正則表達式里亂七八糟的字符都是什么意思:
1、常用的元字符
? ? ? 代碼 ? ?? | ? ? ? ? ? ? ? ? ? ? ? ? ?說明 ? ? ? ? ? ? ? ? ? ? |
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
?
?
?
?
?
?
?
那我們試著理解下:
\bhello\b??其實就是查找單詞hello了——先是某個單詞開始處(\b),然后是字符串hello,最后是單詞結束處(\b)。
010-\d\d\d\d\d\d\d\d? 比如北京的固定電話——先是010-,然后是8個數字(\d)。
^\d{18}$?比如身份證號——先是字符串開始(^),然后是18位數字(\d),最后字符串結束($)。
2、常用的限定符
? ? ? ?代碼 ? ?? | ? ? ? ? ? ? ? ? ? ? ? ? 說明 ? ? ? ? ? ?? ? ? ? ? ?? |
* | 重復零次或更多次 |
+ | 重復一次或更多次 |
? | 重復零次或一次 |
{n} | 重復n次 |
{n, } | 重復n次或更多次 |
{n,m} | 重復n到m次 |
?
?
?
?
?
?
?
\ba\w*\b?匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然后是字母a,然后是任意數量的字母或數字(\w*),最后是單詞結束處(\b)。
windows\d+?匹配windows開頭后面是一位或多位數字的,windows7、windows10等等——\d+即匹配一次或多次數字。
010-\d{8}?也是匹配北京固定電話,跟上面010-\d\d\d\d\d\d\d\d是一個意思,這個更簡便——\d{8}就是連續匹配八次數字的意思。
3、常用的反義代碼
? 代碼? | 說明 |
\W | ?匹配任意非字母或數字或下劃線或漢字的字符 |
\S | 匹配任意非空白符的字符? |
\D | 匹配任意非數字字符 |
\B | 匹配非單詞開始或結束的地方? |
[^x] | 匹配除x以外的任意字符? |
[^aeiou] | 匹配除元音以外的任意字符 |
?
?
?
?
?
?
?
"s[^"]+"?匹配用引號括起來的以s開頭的字符串。
4、常用分組語法
代碼 | 說明 |
(exp) | 匹配exp,并捕獲文本到自動命名的組里 |
(?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) |
(?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 |
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
?
?
?
?
?
?
?
\b\w*h(?!e)\w*\b?這個相對復雜一點,但是借助上面的表格,應該也能讀懂,下面詳細分析下——單詞開始(\b);然后跟零個或多個字母(\w*),因為是單詞嘛,就只能是字母啦;接著是字母h,后面接一個不是e的字符(?!e),然后又是零個或多個字母(\w*),直到單詞結束(\b)。那我們就清楚了,也就是找“含有h字母,但h后面不是e的單詞”,比如him、honey。而把諸如hello、help這樣的單詞排除。
5、懶惰限定符
? ? ? 代碼 ? ?? | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
*? | 重復任意次,但盡可能少重復 |
+? | 重復1次或更多次,但盡可能少重復 |
?? | 重復0次或1次,但盡可能少重復 |
{n,m}? | 重復n到m次,但盡可能少重復 |
{n, }? | 重復n次以上,但盡可能少重復 |
?
?
?
?
?
?
當正則表達式中包含能接受重復的限定符時,通常的行為是匹配盡可能多的字符。例如:a.*b?它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配;但是用?a.*?b?搜索的話會匹配aab(第一到第三個字符)和ab(第四到第五個字符),這叫懶惰匹配。
6、常用的其他符號
代碼 | 說明 |
\. | 元字符轉義。.是元字符,你沒有辦法匹配它,因為會被理解成別的意思,這時你就得使用\來取消這些字符的特殊意義,即\.。同樣的,其他元字符像*?+等等都需要轉義。 |
[] | 字符集。例如[0-9]匹配數字0到9,等同于\d;[a-z]匹配小寫字母;[.?!]匹配標點符號.?! |
() | 分組。每個組自動擁有組號,從左向右,第一個出現的分組的組號為1,第二個為2,以此類推。(\d{1,3}\.){3}\d{1,3}?是一個簡單的IP地址匹配表達式——\d{1,3}匹配1到3位的數字,(\d{1,3}\.){3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(\d{1,3})。\b(\w+)\b\s+\1\b?可以用來匹配重復的單詞,像go go——首先是一個單詞,這個單詞含有一個或多個字母\b(\w+)\b,該單詞會被捕獲到編號為1的分組中,然后是1個或多個空白符(\s+),最后是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1),單詞結束(\b)。 |
| | ?分枝。^\d{17}(\d|[xX])$?可用來驗證是否為身份證號碼——字符串開始(^),接著匹配17位數字(\d{17}),然后是個數字(\d)或者(|)字母x或X([xX]),字符串結束($)。 |
//i | ?一次匹配。舉例見下文。 |
//g | 全局匹配。?舉例見下文。 |
?下面是//i和//g的用法,我們從一段代碼中加深理解:
1 <html>2 <body>3 4 <script type="text/javascript">5 6 var str="Welcome to Microsoft! ";7 str=str + "We are proud to announce that Microsoft has ";8 str=str + "one of the largest Web Developers sites in the world.";9 document.write(str.replace(/Microsoft/i, "W3School")); 10 11 </script> 12 13 </body> 14 </html>
上面的代碼呢,是想把字符串中的Microsoft替換成W3School,當正則表達式為/Microsoft/i時,運行結果:Welcome to W3School! We are proud to announce thatMicrosoft?has one of the largest Web Developers sites in the world. ?可以看出只有第一個Microsoft被替換了,即一次匹配。
我們將正則表達式/Microsoft/i改為/Microsoft/g,結果就變為:Welcome to W3School! We are proud to announce that W3School has one of the largest Web Developers sites in the world. 也就是說全文凡是有Microsoft的地方都被替換成W3School,即全局匹配。?
??
當然還有很多代碼沒有涉及到,但是很多正則表達式應該能看懂了,入門了后面的學習就相對簡單了。如果沒懂可能確實我講得不清楚。大家可以去搜索相關更多文章,每個作者表達事情的方式都不一樣,你可以看看你能更快更好地接收誰的說法。
以上內容如果有誤,深表抱歉,也希望大家能及時指出,不吝賜教,謝謝。