正規表示式在所有語言中都是通用的,它使用一種特定的規則來匹配乙個字串,當滿足這個規則,就認為此字串匹配成功。結合各個語言中的不同方法,可以返回匹配成功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開頭的字串。
常用限定符
個人理解限定符就相當於把原來的元字元從加法轉換成了乘法。
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
重複n次
重複n次或更多次
重複n到m次
例如\d\d\d\d\d匹配五個數字現在就可以寫成\d。
abc\d+匹配abc後面跟1個或更多數字
^\w+匹配一行的第乙個單詞
分組
重複單個字元很簡單,那重複多個字元就需要用到分組了。分組就是在你需要重複的字元外加乙個括號。這就像我們做四則運算時需要先算加法再算乘法的話,需要先把加法式子用括號括起來一樣。
捕獲
(exp) 匹配exp,並捕獲文字到自動命名的組裡
(?exp) 匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文字,也不給此分組分配組號
零寬斷言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp後面的位置
(?!exp) 匹配後面跟的不是exp的位置
(?在正規表示式中,用括號分組之後的匹配文字會**獲到自動命名的組中,每個分組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為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次以上,但盡可能少重複
0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。分支的用法就相當於或,匹配 | 分割的任意乙個規則。
需要注意的是,分支也有短路現象。
當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。但我們有時候需要的是匹配盡可能短的字元,這個時候就需要用到懶惰匹配。
a.*?b匹配最短的,以a開始,以b結束的字串。當我們輸入abbaab時,它會匹配ab和aab。
常用匹配規則
以下整理自網路
[\w!#$%&'*+/=?^_`~-]+(?:\.[\w!#$%&'*+/=?^_`~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
[a-za-z]+://[^\s]*
匹配18位身份證號碼:
^(\d)(\d)(\d)(\d)(\d)([0-9]|x)$
匹配合法年月日:
([0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9])-(((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])))
正規表示式結合例項簡單梳理
正規表示式在所有語言中都是通用的,它使用一種特定的規則來匹配乙個字串,當滿足這個規則,就認為此字串匹配成功。結合各個語言中的不同方法,可以返回匹配成功true false或者匹配的字串等。本文對正規表示式做乙個簡單的知識梳理,結合一些小例子來加深印象。常用元字元 既然是特定的規則,那麼在正規表示式中...
正規表示式知識梳理
概述 正規表示式 regular expression 描述了一種字串匹配的模式 pattern 可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串等。正規表示式是由普通字元 例如字元 a 到 z 以及特殊字元 稱為 元字元 組成的文字模式。模式描述在搜尋文字時...
正規表示式知識梳理
首先先貼個 此工具是用來幫助理解正規表示式的,在你閱讀正規表示式的時候非常有用。具有特殊含義的非字母字元。包括 如果你能一下子就說出這些符號的含義,表示正規表示式的基礎已經掌握了。用來匹配一類字元裡的乙個 表示不包括這類字元。中括號中的 表示取反的意思 中括號的裡 表示範圍的意思。匹配所有字元。d ...