內容包括:
結構和操作符
注意要點
案例分析
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 量詞連綴問題
假設,要匹配這樣的字符串:
- 每個字符爲 "a、"b"、"c" 任選其一,
- 字符串的長度是 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\)/
。 至於剩下的 ^
、$
、.
、*
、+
、?
、|
、\
、/
等字符,只要不在字符組內,都需要轉義的。