正則表達式正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。
===================元字符=========================/b是正則表達式規定的一個特殊代碼 它只匹配一個位置。假如你要找的是hi后面不遠處跟著一個Lucy,你應該用/bhi/b.*/bLucy/b。
.是另一個元字符,匹配除了換行符以外的任意字符。
.*連在一起就意味著任意數量的不包含換行的字符。
/d是個新的元字符,匹配一位數字(0,或1,或2,或……)。-不是元字符,0/d{2}-/d{8} 以0開頭,然后是兩個數字,然后是一個連字號“-”,最后是8個數字(也就是中國的電話號碼
/s匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等。/w匹配字母或數字或下劃線或漢字等。
=====================字符類============================[a-z0-9A-Z_]也完全等同于/w(如果只考慮英文的話)。[ ] [aeiou]就匹配任何一個英文元音字母,[.?!]匹配標點符號(.或?或!)。
=====================字符轉義=====================/. /*
==================重復=====================+是和*類似的元字符,不同的是*匹配重復任意次(可能是0次),而+則匹配重復1次或更多次。?重復零次或一次{n}重復n次{n,}重復n次或更多次{n,m}重復n到m次
=======================================^匹配字符串的開始$匹配字符串的結束QQ號必須為5位到12位數字時,可以使用:^/d{5,12}$/b表示一個單詞的邊界
/p{Lower}表示任意小寫字母/p{Upper}表示任意大寫字母/p{Alpha}表示任意一個字母字符/p{Alnum}表示任意一個字母 或數字字符/p{Punct}表示任意一個標點符號=============== ======分枝條件==============================正則表達式里的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用 | 把不同的規則分隔開。
匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。
======================分組==================================用小括號來指定子表達式(也叫做分組)(/d{1,3}/.){3}/d{1,3}是一個簡單的IP地址匹配表達式正則表達式中并不提供關于數學的任何功
字符類來描述一個正確的IP地址:((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)
=======================反義======================常用的反義代碼(大寫)代碼/語法說明/W匹配任意不是字母,數字,下劃線,漢字的字符 /S匹配任意不是空白符的字符/D匹配任意非數字的字符/B匹配不是單詞開頭或結束的位置[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou這幾個字母以外的任意字符
<a[^>]+>匹配用尖括號括起來的以a開頭的字符串。
=====================后向引用========================
(?'Word'/w+)),這樣就把/w+的組名指定為Word了
要反向引用這個分組捕獲的內容,你可以使用/k<Word>
表4.常用分組語法分類代碼/語法說明捕獲(exp)匹配exp,并捕獲文本到自動命名的組里(?<name>exp)匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)(?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號零寬斷言(?=exp)匹配exp前面的位置(?<=exp)匹配exp后面的位置(?!exp)匹配后面跟的不是exp的位置(?<!exp)匹配前面不是exp的位置注釋(?#comment)不對正則表達式的處理產生任何影響,用于提供注釋讓人閱讀
====================零寬斷言======================(?=exp)也叫零寬度正預測先行斷言比如/b/w+(?=ing/b),singing while you're dancing.時,它會匹配sing和danc。(?<=exp)也叫零寬度正回顧后發斷言它斷言自身出現的位置的前面能匹配表達式exp。(?<=/s)/d+(?=/s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。
====================負向零寬斷言===================
負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。匹配包含后面不是字母u的字母q的單詞/b/w*q(?!u)/w*/b。零寬度負預測先行斷言(?!exp),斷言此位置的后面不能匹配表達式exp/b((?!abc)/w)+/b匹配不包含連續字符串abc的單詞。零寬度負回顧后發斷言:(?<!exp),斷言此位置的前面不能匹配表達式exp
(?<=<(/w+)>).*(?=<///1>)匹配不包含屬性的簡單HTML標簽內里的內容如 (?<=<(/bdiv/b)>).*(?=<///1>)
==========================注釋================ (?<= # 斷言要匹配的文本的前綴 <(/w+)> # 查找尖括號括起來的字母或數字(即HTML/xml標簽) ) # 前綴結束 .* # 匹配任意文本 (?= # 斷言要匹配的文本的后綴 <///1> # 查找尖括號括起來的內容:前面是一個"/",后面是先前捕獲的標簽 ) # 后綴結束
========================貪婪與懶惰===============
表5.懶惰限定符代碼/語法說明*?重復任意次,但盡可能少重復+?重復1次或更多次,但盡可能少重復??重復0次或1次,但盡可能少重復{n,m}?重復n到m次,但盡可能少重復{n,}?重復n次以上,但盡可能少重復正則表達式有另一條規則,比懶惰/貪婪規則的優先級更高:最先開始的匹配擁有最高的優先權
======================處理選項=======================表6.常用的處理選項名稱說明IgnoreCase(忽略大小寫)匹配時不區分大小寫。
Multiline(多行模式)更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字符串的開頭和結尾匹配。(在此模式下,$的精確含意是:匹配/n之前的位置以及字符串結束前的位置.)
Singleline(單行模式)更改 . 的含義,使它與每一個字符匹配(包括換行符/n)。IgnorePatternWhitespace(忽略空白)忽略表達式中的非轉義空白并啟用由#標記的注釋。ExplicitCapture(顯式捕獲)僅捕獲已被顯式命名的組。
例子< #最外層的左括號 [^<>]* #最外層的左括號后面的不是括號的內容 ( ( (?'Open'<) #碰到了左括號,在黑板上寫一個"Open" [^<>]* #匹配左括號后面的不是括號的內容 )+ ( (?'-Open'>) #碰到了右括號,擦掉一個"Open" [^<>]* #匹配右括號后面不是括號的內容 )+ )* (?(Open)(?!)) #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果還有,則匹配失敗
> #最外層的右括號
匹配嵌套的<div>標簽:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.
新聞熱點
疑難解答