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

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

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

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

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

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