一、字符集合
字符集合,也可以叫做字符類,它允許我們從多個候選字符中提取一個滿足條件的字符。它的語法形式有兩種, [abcdef] 和 [a-f] 。雖然是集合,但每次只允許匹配一個單字符,如果要進行重復性匹配操作,就要借助“*”、“+”和花括號的功能了。讓我們先學習一下[abcdef]這種形式的用法。
假如我們要對電話號碼格式進行驗證,以“+086-800-800-8888”為例,其中 +086 的加號和首位數字都是可選字符。現在,我們對號碼的第二個字符進行分析,它是一個 0 至 9 的數字,字符集合的表示方法是[0123456789],它可以與 0 至 9 之間的任意一個字符進行匹配。接下來我們要做的就是確定每個部分的匹配次數, [0123456789]{3} 、 [0123456789]{3} 、 [0123456789]{3} 和 [0123456789]{4} 。又因為 086 的首位可選,所以,我們最終構造出來的正則表達式語法為 /+?[0123456789]{2,3}-[0123456789]{3}-[0123456789]{3}-[0123456789]{4} 。這里值得注意的地方是“+”需要轉義,因為“+”是正則表達式的語法一部分,它是具有特殊含義的,無法被我們直接利用,如果要使用“+”,就要對它進行轉義。轉義后的“/+”能告訴正則表達式引擎,當前這個“+”不是語法具有特殊意義,只是一個字符“+”而已。

二、字符范圍的表示
字符集合的第二種語法形式 [a-f] 可以簡化連續字符的書寫方法,上例中的 [0123456789] 就能夠簡化為 [0-9] ,這樣,簡化后的語法就成為 /+?[0-9]{2,3}-[0-9]{3}-[0-9]{3}-[0-9]{4} 。我們還可以混合使用字符集合的語法,來提高靈活性。如 [a-fuwy0-9] :

如果方括號內的“-”的兩端不是表示范圍開始和結束的字符的話,它就會被當作普通的“-”來處理。讓我們再看一個例子。現在要從句子“Javascript includes built-in support for array, date, and Regular-expression objects.”中提取那些含有“-”的復合詞。我們先采用字符集合的形式來匹配“-”,使用語法 [a-zA-z]+[-][a-zA-z]+ ,當然我們也可以直接寫“-”來進行匹配 [a-zA-z]+-[a-zA-z]+ :

看了上面的例子有些讀者可能會感到很奇怪,既然可以指定字符集合的范圍,我們為什么不直接寫 [A-z] ,而要采用 [a-zA-Z] 這種形式呢?這是因為在ASCII和Unicode字符集中,大小寫字母的位置并不是連續的,它們之間還有六個其它字符,如下圖所示:
三、使用補集^
前面的兩種語法都是正常匹配時所要用到的,但是,如果我們想使一個不存在于字符集合中的字符滿足匹配條件時,又該怎么實現呢?換一句話說,除了集合之外的所有字符都是我們想要匹配的字符,正則表達式提供了一種 [^abcf-i] 的語法形式。對于這種語法,我們可以先按照正常思路考慮 [abcf-i] 的含義,匹配 abc 中任意一字符和 f 至 i 之間的字符,然后轉過來理解,不滿足 abc 中任意一字符和 f 至 i 之間的字符的內容,都是我們想要匹配的目標。值得注意的是“^”必須緊挨在左方括號的右邊,否則它就不具有特殊含義,只是普通的字符“^”而已。

四、選擇
字符集合能夠從多個候選字符中選中一個來與目標字符進行匹配,但是,如何提供多個連續的候選字符組合呢?在正則表達式中,就有一個提供這樣功能的元字符“|”。它將我們要匹配的字符組合用“|”分隔開,然后在目標字符串中進行匹配,只要有與分隔部分的內容能夠匹配上的話,就能進行匹配。
下面是一段人物眾多的小笑話,要理解起來本來是很費勁兒的,但通過正則表達式 魔王|公主|沒有人|曹操|鬼|靠|誰|上帝 把所有的人物角色全列出來,就容易理解得多了。
《喊破喉嚨》 魔王 把 公主 帶回了自己的城堡。 魔王 :你盡管喊破喉嚨吧, 沒有人 會來救你的! 公主 :破喉嚨!破喉嚨! 沒有人 : 公主 !我來救你了! 魔王 :說 曹操 曹操 到! 曹操 : 魔王 ,你叫我干嘛?! 魔王 :哇勒!看到 鬼 了!! 鬼 : 靠 !被發現了! 靠 :胡說, 誰 發現我了! 誰 :關我屁事! 魔王 :Oh~my God! 上帝 : 誰 叫我?! 誰 : 沒有人 叫你啊! 沒有人 :我哪有!! 魔王 從此得了精神分裂癥……
五、知識要點補充與鞏固
到現在為止,我們已經學會了很多基本的樣式匹配,下面表格中是對前面的知識內容的一個總結。
語法形式 語法含義A | 匹配一個單一字符“A” |
. | 匹配任意一個字符 |
? | 重復零次或一次 |
/? | 轉義后的字符“?” |
* | 重復零次或更多次(貪婪模式) |
+ | 重復一次或更多次(貪婪模式) |
*? | 重復零次或更多次(懶惰模式) |
+? | 重復一次或更多次(懶惰模式) |
{n} | 重復 n 次 |
{n,} | 重復 n 次或更多次 |
{m,n} | 重復 m 到 n 次(貪婪模式) |
{m,n}? | 重復 m 到 n 次(懶惰模式) |
[abc] | 匹配“a”,“b”,“c”中的任意一個字符 |
[abcf-i] | 匹配“a”,“b”,“c”,“f”至“g”中的任意一個字符 |
[^1-37a-gx] | 匹配“1”至“3”,“7”,“a”至“g”,“x”之外的任意一個字符 |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
