思路來源: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})。
不幸的是,它也將匹配256.300.888.999這種不可能存在的IP地址。若是能使用算術比較的話,或許能簡單地解決這個問題,可是正則表達式中並不提供關於數學的任何功能,因此只能使用冗長的分組選擇。
這個表達式描述了一個正確的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