正則表達式結合實例簡單梳理
正則表達式在所有語言中都是通用的,它使用一種特定的規則來匹配一個字符串,當滿足這個規則,就認為此字符串匹配成功。結合各個語言中的不同方法,可以返回匹配成功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
正則表達式結合實例簡單梳理