規則表達式(Regular Expression),又稱做正則表達式,一般用於檢索、替換符合指定規則的文本,正則表達式定義的規則,稱做模式(Pattern),即正則表達式的做用是從文本中查找到符合模式的文本。正則表達式
正則表達式定義的模式,是由"\"+普通字符構成的,把「\」字符稱做轉義字符,是由於它把普通的字符轉義爲有特殊含義的元字符。注意,正則表達式是區分大小寫的,能夠經過表達式選擇來忽略大小寫限制。spa
1,經常使用元字符.net
用以匹配特定的字符(字母,數字,符號),注意字母是區分大小寫的:htm
2,重複字符或分組blog
指定前面一個字符或分組重複的次數:教程
3,分組,轉義,分支文檔
這些字符有特定的含義和用途:字符串
匹配字符是指在元字符所在的位置處,匹配一個字符:get
注意:正則表達式是區分大小寫的,元字符的大寫和小寫形式表示的含義是不一樣的;文本字符的大小寫也是不一樣的。it
元字符其實是由字符「\」和普通字符構成的,「\」稱做轉義字符,也就是說,「\」的做用是把普通字符轉換爲特殊的字符。因爲元字符也是文本中的普通字符,當須要匹配這些特殊字符時,例如,文本中包含"\","."等特殊字符時,必須使用轉義字符,把特殊字符轉義爲普通字符。對於轉義字符自己,\\表示一個「\」。
使用\s匹配全部空白字符,包括:空格符,製表符,換行符和回車符。
元字符中匹配位置的元字符主要是:
匹配位置的元字符不佔用字符,只是匹配一個位置,例如,\b 表示匹配一個位置,並不佔用任何字符,這個位置的一側是單詞字符,一側爲非單詞字符。
字符組是若干字符的組合,表示只匹配其中一個字符:
1,字符組
若是要匹配字符grey和gray,可使用字符組: gr[ae]y,該正則表達式的意思是:先找到字符gr,而後跟着一個a或e,最後是一個字符y。
注意:在字符組之外,普通字符(如gr[ae]y中的g和r)都有接下來是(and then)的意思,這與字符組內部的狀況是徹底相反的。字符組的內容是在同一個位置可以匹配的若干字符,因此他的意思是「或」。如「[0123456789]」就是匹配1到9之間的任意一個數字。若是「<H[1234]>」就是用來匹配<H1>,<H2>,<H3>,<H4>。
2,連字符
在字符組內部「-」(連字符)出如今兩個字符中間,表示一個範圍,例如:
注意:只有在字符組內部,連字符纔是元字符,不然他就是隻能匹配普通的連字符號。連字符還有一個例外,即便在字符組內部,若是連字符出如今字符組的開頭(或排除型字符組的開頭,下面會講,如[^-]),那也不是元字符而只是一個普通字符。一樣的道理,問號和點號(後面會講到這兩個元字符)一般被當作元字符處理,但在字符組裏則不是如此。只有連字符和^(下面立刻講到,是排除字符)纔多是字符組裏的元字符(可是轉義符,字符組簡記法仍然有效,即[\da-zA-Z]或[^\da-zA-Z]或[\\"]中的\仍然有轉義的含義,\d仍然表明數字,\\"仍然表明字符串中的「\"」單獨的\不會匹配任何字符,\\會匹配字符'\')。至關於字符組內部有一個本身獨立的小世界,有本身的規則。
3,字符組內的排除字符
用「[^…]」取代「[…]」,這個字符組就會匹配任何未列出的字符。例如」[^1-8]」匹配除了1到8之外的任何字符。注意:這句話有兩層含義,一個是排除1-8字符,另外一個是必定要匹配一個字符。
例子:匹配q後面不是u的字符,正則是」q[^u]」。那麼qi會被匹配。那Qantas呢?Iraq呢?答案是這兩個都不會被匹配,一個是由於Q是大寫,一個是由於q在最後,後面沒有除了u之外的任何字符。再次注意,排除型字符組也是要匹配一個字符的。
量詞用於設置匹配前面一個字符的次數:
問號,加號和星號統稱爲量詞,表示前面一個字符的重複次數。
1,可選字符 ?
這些元字符,只用於匹配相鄰的前一個字符;若是要匹配多個字符,須要使用(),那麼用於表示()內的字符重複,例如:
把()做爲一個總體來看待,是一個元素,括號內的元素能夠不少。
2,「+(加號)」和」*(星號)」
+和*的做用與?相似,元字符」+」表示「前面緊鄰的元素出現一次或屢次」;而元字符」*」表示「前面緊鄰的元素不出現或出現任意屢次」,換種說法就是」*」表示匹配儘量多的次數,但若是一次都不匹配也不要緊。」+」表示匹配儘量多的次數,但若是一次都不匹配就報告失敗。
3,區間量詞
區間量詞「{min, max}」 表示重複次數的範圍,其中min爲下限,若是min爲空,表示沒有下限;max爲上線,若是max爲空,表示沒有上限。例如,對於正則 」a{3,12}」表示可以允許a出現3到12次,用區間量詞來表示其餘量詞:問號對應「{0,1}」,加號對應」{1,}」, 星號對應」{0,}」
元字符「|」,表示「或(or)」關係,表示從多個候選的子表達式中,只須要匹配一個。子表達式的範圍是由()來限制的,若是沒有(),那麼以元字符「|」,把表達式分割爲兩個子表達式,例如:
「gr[ea]y」與「gr(a|e)y」的例子可能會讓人以爲多選結構與字符組沒太大的區別,可是不要混淆這兩個概念。一個字符組只能匹配目標文本中的單個字符,而每一個多選結構自身多是完整的正則表達式,均可以匹配任意長度的文本。
比較」^From|Subject|Date:*」和」^(From|Subject|Date):*」會發現匹配結果大不相同,第一個表達式由3個多選分支構成,能匹配」^From」或」Subject」或」Date:*」,實用性不大。咱們但願在每個多選分支前都有脫字符,以後都有」:*」,因此應該使用括號來限制這些多選分支: 」^(From|Subject|Date):*」,含義是匹配以「From:*」或「Subject:*」或「Date:*」開頭的文本行。
()是分組元字符,最多見的用途是:
還有一個做用是環視,下文分享。
參考文檔: