正則基礎
\b ? ?是正則表達式的一個特殊代碼,有人稱它元字符。代表的是需要匹配的某個單詞的開頭或者結尾。有些單詞有空格或者分隔符,但是\b并不管這些,它只匹配一個位置,也就是說,空格,分隔符它也比較。
. ? ?是另一個元字符,表示匹配除了換行符以外的任意字符。
* ? ?也是一個元字符,不過它代表的不是字符,也不是位置,而是數量。它制定*字符前邊的內容可以連續重復使用任意次以使整個表達式得以匹配。
.* ? ?連在一起,就表示任意數量除了換行以外的任意字符。
例子:\bhi\b.*\bLucy\b表示以hi開頭,中間任意數量除換行以外的任意字符,并且以Lucy結尾。
\d ? ?是一個新的元字符,匹配任意一個數字(可以是0,可以是1...)
- ? ?不是元字符,其實它就只匹配它本身,可以稱它鏈接符,也可以稱它減號,由自己啦!
例子:0\d\d-\d\d\d\d\d\d\d表示0開頭,后跟2個任意數字,接著是鏈接-,最后是7個任意數字。當然,避免重復,可以簡化寫出0\d{2}-\d{7}
\s ? ?表示匹配任意空白符,包括空格,制表符(tab),換行符,中文全角空格等。
\w ? ?匹配字母,數字,下劃線,或者漢字等。
^ ? ?匹配字符串開始。
$ ? ?匹配字符串結束。
例子:
\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然后是字母a,然后是任意數量的字母或數字(\w*),最后是單詞結束處(\b)。
\d+匹配1個或更多連續的數字。這里的+是和*類似的元字符,不同的是*匹配重復任意次(可能是0次),而+則匹配重復1次或更多次。
\b\w{6}\b匹配剛好6個字符的單詞。
{n} ? ?重復N次
{n, } ? ?重復n次到更多次
{n,m} ? ?重復n到m次
{5,12} ? ?表示重復的次數不能少于5次,不能多于12次。
例子:^\d{5,12}$匹配一個5-12位的數字。
\ ? ?表示轉義符。比如你要匹配字符串中的.或者*等等,匹配不到,可以用\.或者\*當然,你要匹配\的話,就用\\
+ ? ?和*相似,但是+表示重復一次或多次。
? ? ?重復0次或1次。
[ ] ? ?指定一個范圍。[0-9]表示一位數字,[a-zA-Z]
例子:\(?0\d{2}[) -]?\d{8}這個表達式可以匹配幾種格式的電話號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它進行一些分析吧:首先是一個轉義字符\(,它能出現0次或1次(?),然后是一個0,后面跟著2個數字(\d{2}),然后是)或-或空格中的一個,它出現1次或不出現(?),最后是8個數字(\d{8})。
不幸的是,上面那個例子也能匹配010)12345678或(022-87654321這樣的“不正確”的格式。要解決這個問題,我們需要用到分枝條件。正則表達式里的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。
| ? ?分割不同的規則,但是使用時候要嚴格注意匹配順序,因為如果符合第一個條件,就不會審核第二個條件了。
例子:0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
\(?0\d{2}\)?[-]?\d{8}|0\d{2}[- ]?\d{8}這個表達式匹配3位區號的電話號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔。
\d{5}-\d{4}|\d{5}如果你把它改成\d{5}|\d{5}-\d{4}的話,那么就只會匹配5位的郵編(以及9位郵編的前5位)。原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。
( ) ? ?重復多個字符,用()來指定子表達式,也可以叫做分組,可以指定( )中的元素重復多次。
例子:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)判斷正確的IP地址
\W ? ?匹配任意不是字母,數字,下劃線,漢字的字符
\S ? ?匹配任意不是空白符的字符
\D ? ?匹配任意非數字的字符
\B ? ?匹配不是單詞開頭或結束的位置
[^x] ? ?匹配除了x以外的任意字符
[^aeiou] ? ?匹配除了aeiou這幾個字母以外的任意字符
例子:\S+匹配不包含空白符的字符串。
]+> ? ?匹配尖括號開始包含a打頭字母的字符串。
正則匹配進階
后向引用
使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。
后向引用用于重復搜索前面某個分組匹配的文本。例如,\1代表分組1匹配的文本。
例子:\b(\w+)\b\s+\1\b可以用來匹配重復的單詞,像go go,或者kitty kitty。這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中,然后是1個或幾個空白符(\s+),最后是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。
捕獲
(exp) ? ?匹配exp,并捕獲文本到自動命名的組里
(?exp) ? ?匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) ? ?匹配exp,不捕獲匹配的文本,也不給此分組分配組號
引用
\k(Word)反向引用這個分組捕獲的內容
零寬斷言
(?=exp) ? ?匹配exp前面的位置
(?<=exp) ? ?匹配exp后面的位置
(?!exp) ? ?匹配后面跟的不是exp的位置
注釋
(?#comment) ?這種類型的分組不對正則表達式的處理產生任何影響,用于提供注釋讓人閱讀
例子:\b(\w+)\b\s+\1\b通過上面介紹,可以改寫成\b(?\w+)\b\s+\k\b