正則表達式快速入門


首先簡單介紹下正則表達式:

      在編寫處理字符串的程序或網頁時,經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。

下面就看看正則表達式里亂七八糟的字符都是什么意思:

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 that Microsoft 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,即全局匹配。 

  

當然還有很多代碼沒有涉及到,但是很多正則表達式應該能看懂了,入門了后面的學習就相對簡單了。如果沒懂可能確實我講得不清楚。大家可以去搜索相關更多文章,每個作者表達事情的方式都不一樣,你可以看看你能更快更好地接收誰的說法。

以上內容如果有誤,深表抱歉,也希望大家能及時指出,不吝賜教,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM