感謝deerchao,寫的比菜鳥教程好太多了。現在感覺菜鳥教程可能就是翻譯了一些doc,而且是思路結構不太清晰的doc……
進入正題,主要還是看了教程後自己的理解。
字元類
字元類,即為如 [aeiou]、[1-9]、[19]、[.?!] 等用英文中括號括起字元的字元集合。
解釋與辨析:
[aeiou]:匹配a 或 e 或 i 或 o 或 u 。
[0-9]:匹配 0 或 1 或 2 或 3……0-9 中的乙個數字。(含義與 \d 完全一致:一位數字)
[09]:匹配 0 或者是 9 。
[.?!]:匹配 . 或 ?或是 !
同理[a-z0-9a-z_]也基本等同於 \w(匹配非特殊字元,即a-z、a-z、0-9、下劃線、漢字)。
#補充 \w 的意思:匹配特殊字元,即非字母、非數字、非下劃線、非漢字。
所以中括號就像是劃定了乙個字元範圍一樣。接下來是乙個複雜的表示式: \(?0\d[) -]?\d。
這個表示式可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或是02912345678等等。
對它進行分析:首先是\(對左括號的轉義,同時加?代表可1可無;然後是乙個數字0和\d,代表0和兩個數字;往後就是乙個字元類範圍[) -]?,左括號、空格、hyphen三選一可1可無;最後是\d八個數字。
不幸的是這樣的表示式也會匹配到一些錯誤的**號碼格式,如010)12345678、(022-87654321。
分支條件
正規表示式中的分支條件指:我現在有這幾種匹配規則,如果物件滿足其中任意一種匹配規則就成功。具體方法是用 | 把不同的匹配規則分開。
0\d-\d|0\d-\d這個表示式能匹配兩種帶有hyphen連線的匹配規則:一種是三位區號,8位本地號(如010-12345678);一種是4位區號,7位本地號(0376-2233445)。
\(0\d\)[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用(兩種匹配規則),區號與本地號間可以用hyphen或空格間隔,也可以都不用,但不能都用。我覺得[ -]?可以這樣理解:先[ -]二選一,再?對二選一出來的東西其判斷0或1。
如果你把上面的表示式改成\d|\d-\d(兩規則前後調換)的話,那就只會匹配5位的郵編(以及9位郵編的前5位)。原因是當系統在匹配分支條件中的不同規則時,將會從左到右地測試每個規則。當滿足了第乙個分支規則的話,就不會再去測試第二個分支規則了。如下圖↓所詮釋的:
分組
我們已經知道如何重複單個字元(在字元後新增限定符+*?即可)。但如果我們需要重複多個字元該怎麼辦?故引入概念:分組。
分組就是在多個字元(子表示式)的左右新增小括號,然後加。就指定了這個子表示式的重複次數n了。
(\d\.)\d 是乙個簡單的ip位址匹配表示式。
分析這個表示式:()代表它是乙個重複三次的分組,括號內\d\.指一到三位數字加乙個point點,合在一起 (\d\.) 就是匹配三位數字加上乙個point點(這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。
不幸的是,它也將匹配256.300.888.999這種不可能存在的ip位址。如果能使用算術比較的話,或許能簡單地解決這個問題,但是正規表示式中並不提供關於數學的任何功能,所以只能使用冗長的分組選擇。
理解這個表示式的關鍵是理解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
正規表示式 分支條件
從網上看到一篇有關正規表示式的敘述,走馬觀花看了一眼,一時來了興趣,便弄了弄。有關正規表示式分支使用 d d d與 d d d?有如下兩個js函式 function isdigit str var reg d d d return reg.test str function isdigit1 str...
正規表示式 分組
正規表示式對於單個字元的重複,非常方便。比如 d 表示1個或多個數字,表示重複0次或多次 重複1次或多次 重複0次或1次 重複n次 重複n次或多次 重複n次到m次 指定的字元後加特定的限定符,即可實現單字元的重複,那麼,對於一組字串的重複,正規表示式該如何操作?用小括號來指定子表示式 或稱分組 對指...
分組 正規表示式
在正規表示式中,可以用小括號將一些規則括起來當作分組,分組可以作為乙個元字元來看待。d d這是乙個簡單的且不完善的匹配 ip 位址的正規表示式,因為它除了能匹配正確的 ip 位址外,還能匹配如 322.197.578.888 這種不存在的 ip 位址。當然,用這個表示式簡單匹配成功後可以在利用 ph...