正則表達式——字符類、分支條件、分組

思路來源:http://deerchao.net/tutorials/regex/regex.htm#alternative正則表達式

感謝deerchao,寫的比菜鳥教程好太多了。如今感受菜鳥教程可能就是翻譯了一些doc,並且是思路結構不太清晰的doc……測試

進入正題,主要仍是看了教程後本身的理解。編碼

 

字符類spa

字符類,即爲如 [aeiou]、[1-9]、[19]、[.?!] 等用英文中括號括起字符的字符集合。.net

解釋與辨析:翻譯

[aeiou]:匹配a 或 e 或 i 或 o 或 u 。htm

[0-9]:匹配 0 或 1 或 2 或 3……0-9 中的一個數字。(含義與 \d 徹底一致:一位數字)對象

[09]:匹配 0 或者是 9 。blog

[.?!]:匹配 . 或 ?或是 !教程

同理[a-z0-9A-Z_]也基本等同於 \w(匹配非特殊字符,即a-z、A-Z、0-九、下劃線、漢字)。

#補充 \W 的意思:匹配特殊字符,即非字母、非數字、非下劃線、非漢字。

 

因此中括號[]就像是劃定了一個字符範圍同樣。接下來是一個複雜的表達式: \(?0\d{2}[) -]?\d{8}

這個表達式能夠匹配幾種格式的電話號碼,像(010)88886666,或022-22334455,或是02912345678等等。

對它進行分析:首先是\(對左括號的轉義,同時加?表明可1可無;而後是一個數字0\d{2},表明0和兩個數字;日後就是一個字符類範圍[) -]?,左括號、空格、hyphen三選一可1可無;最後是\d{8}八個數字。

 

不幸的是這樣的表達式也會匹配到一些錯誤的電話號碼格式,如010)1234567八、(022-87654321。

因此引入下一個知識點:分支條件。

 

 

分支條件

正則表達式中的分支條件指:我如今有這幾種匹配規則,若是對象知足其中任意一種匹配規則就成功。具體方法是用 | 把不一樣的匹配規則分開。

0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種帶有hyphen鏈接的匹配規則:一種是三位區號,8位本地號(如010-12345678);一種是4位區號,7位本地號(0376-2233445)。

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}這個表達式匹配3位區號的電話號碼,其中區號能夠用小括號括起來,也能夠不用(兩種匹配規則),區號與本地號間能夠用hyphen或空格間隔,也能夠都不用,但不能都用。我以爲[ -]?能夠這樣理解:先[ -]二選一,再?對二選一出來的東西其判斷0或1。

\d{5}-\d{4}|\d{5}這個表達式用於匹配美國的郵政編碼。美國郵編的規則是5位數字,或是用hyphen間隔的9位數字。這個例子能說明一個注意點:使用分支條件時,要注意不一樣條件之間的順序

若是你把上面的表達式改爲\d{5}|\d{5}-\d{4}(兩規則先後調換)的話,那就只會匹配5位的郵編(以及9位郵編的前5位)。緣由是當系統在匹配分支條件中的不一樣規則時,將會從左到右地測試每一個規則。當知足了第一個分支規則的話,就不會再去測試第二個分支規則了。以下圖↓所詮釋的:

 

 

 

分組

咱們已經知道如何重複單個字符(在字符後添加限定符+*?便可)。但若是咱們須要重複多個字符該怎麼辦?故引入概念:分組。

分組就是在多個字符(子表達式)的左右添加小括號,而後加{n}。就指定了這個子表達式的重複次數n了。

(\d{1,3}\.){3}\d{1,3} 是一個簡單的IP地址匹配表達式。

分析這個表達式:(){3}表明它是一個重複三次的分組,括號內\d{1,3}\.指一到三位數字加一個point點,合在一塊兒 (\d{1,3}\.){3} 就是匹配三位數字加上一個point點(這個分組)重複3次,最後再加上一個一到三位的數字(\d{1,3})。

  • 若是不在point點前放置轉義符號,原point點指 匹配除了換行符(\n)以外的任意一個字符。
  • {m,n}指表達式至少重複m次,最多重複n次,好比:"ba{1,3}"能夠匹配"ba"或"baa"或"baaa"。

不幸的是,它也將匹配256.300.888.999這種不可能存在的IP地址。若是能使用算術比較的話,或許能簡單地解決這個問題,可是正則表達式中並不提供關於數學的任何功能,因此只能使用冗長的分組選擇。

  • IP地址中每一個數字都不能大於255。同時, 01.02.03.04 這種數字前面帶有0的地址,也是正確的IP地址。IP 地址裏的數字能夠包含「前導 0 (leading zeroes)「。

這個表達式描述了一個正確的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

理解這個表達式的關鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?。分析它!

總體結構爲帶有兩個 | 的三分組結構。

首先是 2[0-4]\d:數字2 + 0-4中的一個數字 + 0-9中的一個數字;                     200-249

中間是 25[0-5]:數字2 + 數字5 + 0-5中的一個數字;                                        250-255

最後是[01]?\d\d?:0或1(可1可無) + 一個數字 + 一個數字(可1可無)        0-199

相關文章
相關標籤/搜索