1. 程式人生 > >正則表達式結合實例簡單梳理

正則表達式結合實例簡單梳理

知識梳理 字號 while 利用 情況下 tro 條件 字母數 分辨

正則表達式在所有語言中都是通用的,它使用一種特定的規則來匹配一個字符串,當滿足這個規則,就認為此字符串匹配成功。結合各個語言中的不同方法,可以返回匹配成功true、false或者匹配的字符串等。

本文對正則表達式做一個簡單的知識梳理,結合一些小例子來加深印象。

正則表達式的驗證方法現在也多種多樣,在這裏就不推薦了,大家選擇適合自己用得慣的就好。

常用元字符

既然是特定的規則,那麽在正則表達式中就有相對應的特殊符號,你不用去記它的名字是什麽,只需要知道它做了什麽。

.	匹配除換行符以外的任意字符
\w	匹配字母或數字或下劃線或漢字
\s	匹配任意的空白符
\d	匹配數字
\b	匹配單詞的開始或結束
^	匹配字符串的開始
$	匹配字符串的結束

  這裏分辨一下\b與^、$的區別,\b匹配的是單詞的開始或結束,也就是說它匹配的是一個“單詞”,而^與$是匹配字符串的開始或結束。看下面的例子

技術分享圖片技術分享圖片

圖中,用\b去匹配字符串的時候雖然設定的匹配條件是\w.*匹配任意數量的字母數字漢字或下劃線,□□□abc雖然不是以匹配條件開頭,但對於\b來說,a才是一個單詞的開始。而^與$則是指定了必須要以匹配條件開頭,所以□□□abc未能匹配。

另外,對於單詞界限通常認為是以空格,符號做分割。

更多例子:

\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。

^\d\w*$匹配以1個數字開頭,任意字母或數字結尾

常用反義字符

與上述元字符所匹配的規則相反。這裏的反義字符一般用於想匹配沒有數字,或沒有空白字符的情況,也就是限定條件唯一的情況下用比較方便(好吧,可能是我用這方面的功能比較多,其他功能大家可以自行去發掘~)

\W	匹配任意不是字母,數字,下劃線,漢字的字符
\S	匹配任意不是空白符的字符
\D	匹配任意非數字的字符
\B	匹配不是單詞開頭或結束的位置
[^x]	匹配除了x以外的任意字符

需要註意的是,\S匹配的並不是以空格分割的字符串,而是每個字符,也就是說匹配的是單個字符

更多例子:

\S+匹配不包含空白符的字符串。

<a[^>]+>匹配用尖括號括起來的以a開頭的字符串。

常用限定符

個人理解限定符就相當於把原來的元字符從加法轉換成了乘法。

*	重復零次或更多次
+	重復一次或更多次
?	重復零次或一次
{n}	重復n次
{n,}	重復n次或更多次
{n,m}	重復n到m次

例如\d\d\d\d\d匹配五個數字現在就可以寫成\d{5}。

更多例子:

abc\d+匹配abc後面跟1個或更多數字

^\w+匹配一行的第一個單詞

分組

重復單個字符很簡單,那重復多個字符就需要用到分組了。分組就是在你需要重復的字符外加一個括號。這就像我們做四則運算時需要先算加法再算乘法的話,需要先把加法式子用括號括起來一樣。

捕獲
(exp) 匹配exp,並捕獲文本到自動命名的組裏 (?<name>exp) 匹配exp,並捕獲文本到名稱為name的組裏,也可以寫成(?‘name‘exp) (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
零寬斷言 (?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp後面的位置 (?!exp) 匹配後面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置
註釋 (?#comment) 這種類型的分組不對正則表達式的處理產生任何影響,用於提供註釋讓人閱讀

在正則表達式中,用括號分組之後的匹配文本會被捕獲到自動命名的組中,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標誌,第一個出現的分組的組號為1,第二個為2,以此類推。利用這個特點,我們可以給分組命名,這樣就可以很方便地獲得分組中的文本了。

更多例子:

\b(\w+)\b\s+\1\b匹配重復的文本。(括號中的文本被捕獲成一個分組,後面\1又匹配了一次第一個分組中的文本)

(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I‘m singing while you‘re dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表達式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

其他小規則

|     分支
懶惰匹配
*?	重復任意次,但盡可能少重復
+?	重復1次或更多次,但盡可能少重復
??	重復0次或1次,但盡可能少重復
{n,m}?	重復n到m次,但盡可能少重復
{n,}?	重復n次以上,但盡可能少重復

0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。分支的用法就相當於或,匹配 | 分割的任意一個規則

需要註意的是,分支也有短路現象。

當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。但我們有時候需要的是匹配盡可能短的字符,這個時候就需要用到懶惰匹配。

a.*?b匹配最短的,以a開始,以b結束的字符串。當我們輸入abbaab時,它會匹配ab和aab。

常用匹配規則

以下整理自網絡

匹配合法郵箱:
[\w!#$%&‘*+/=?^_`{|}~-]+(?:\.[\w!#$%&‘*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
匹配網址URL:
[a-zA-z]+://[^\s]*
匹配18位身份證號碼:
^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
匹配合法年月日:
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

參考資料:

http://www.jb51.net/tools/zhengze.html

http://blog.sina.com.cn/s/blog_47664968010093q0.html

正則表達式結合實例簡單梳理