正則表達式(五)- 拆分

內容包括:

結構和操作符
注意要點
案例分析

1、結構和操作符

操作符優先級問題 在正則表達式中,操作符都體現在結構中,即由特殊字符和普通字符所代表的一個個特殊整體。 正則表達式結構:字符字面量、字符組、量詞、錨、分組、選擇分支、方向引用。

具體含義如下:

結構 說明
字面量 匹配一個具體字符,包括不用轉義的和需要轉義的。比如a匹配字符"a",<br> 又比如\n匹配換行符,又比如\.匹配小數點。
字符組 匹配一個字符,可以是多種可能之一,比如[0-9],表示匹配一個數字。<br> 也有\d的簡寫形式。<br> 另外還有反義字符組,表示可以是除了特定字符之外任何一個字符,比如[^0-9],<br> 表示一個非數字字符,也有\D的簡寫形式。
量詞 表示一個字符連續出現,比如a{1,3}表示"a"字符連續出現1~3次。<br> 另外還有常見的簡寫形式,比如a+表示"a"字符連續出現至少一次。
匹配一個位置,而不是字符。比如^匹配字符串的開頭,又比如\b匹配單詞邊界,<br> 又比如(?=\d)表示數字前面的位置。
分組 用括號表示一個整體,比如(ab)+, 表示"ab"兩個字符連續出現多次,<br> 也可以使用非捕獲分組(?:ab)+
分支 多個子表達式多選一,比如`abc

操作符:

操作符描述 操作符 優先級
轉義符 \ 1
括號和方括號 (...)、(?:...)、(?=...)、(?!...)、[...] 2
量詞限定符 {m}、 {m,n}、 {m,}、 ?、 *、 + 3
位置和序列 ^ 、$、 \元字符、一般字符 4
管道符(豎槓) | 5

上面操作符的優先級從上到下,由高到低。

2、注意要點

關於結構和操作符,還是有幾點需要強調:

2.1 匹配字符串整體問題

因爲是要匹配整個字符串,我們經常會在正則前後中加上錨^$。 比如要匹配目標字符串"abc"或者"bcd"時,如果一不小心,就會寫成/^abc|bcd$/。 而位置字符和字符序列優先級要比豎槓高,應該修改成:/^(abc|bcd)$/

2.2 量詞連綴問題

假設,要匹配這樣的字符串:

  1. 每個字符爲 "a、"b"、"c" 任選其一,
  2. 字符串的長度是 3 的倍數。 此時正則不能想當然地寫成 /^[abc]{3}+$/,這樣會報錯,說 + 前面沒什麼可重複的: 此時要修改成:/([abc]{3})+/

2.3 元字符轉義問題

所謂元字符,就是正則中有特殊含義的字符。 所有結構裏,用到的元字符總結如下:^$.*+?|\/()[]{}=!:-

2.3.1 字符組中的元字符

跟字符組相關的元字符有 []^-。因此在會引起歧義的地方進行轉義。例如開頭的 ^ 必須轉義,不然 會把整個字符組,看成反義字符組。

2.3.2 匹配 "[abc]""{3,5}"

我們知道 [abc],是個字符組。如果要匹配字符串 "[abc]" 時,該怎麼辦? 可以寫成 /\[abc\]/,也可以寫成 /\[abc]/,測試如下:

var string = "[abc]";
var regex = /\[abc]/g;
console.log( string.match(regex)[0] ); // "[abc]"

只需要在第一個方括號轉義即可,因爲後面的方括號構不成字符組,正則不會引發歧義,自然不需要轉義。

同理,要匹配字符串 "{3,5}",只需要把正則寫成/\{3,5}/即可。 另外,我們知道量詞有簡寫形式 {m,},卻沒有 {,n} 的情況。雖然後者不構成量詞的形式,但此時並不會報 錯。當然,匹配的字符串也是 "{,n}",測試如下:

var string = "{,3}";
var regex = /{,3}/g;
console.log( string.match(regex)[0] ); //  "{,3}"

2.3.3 其餘情況

比如 =!:-、, 等符號,只要不在特殊結構中,並不需要轉義。 但是,括號需要前後都轉義的,如 /\(123\)/。 至於剩下的 ^$.*+?|\/ 等字符,只要不在字符組內,都需要轉義的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章