角色類和初學者面臨的常見問題
1.人物類
字元類由 []
表示。字元類中的內容被視為 single character separately
。例如,假設我們使用
[12345]
在上面的例子中,它意味著匹配 1 or 2 or 3 or 4 or 5
。簡單來說,它可以理解為 or condition for single characters
( 對單個字元的壓力 )
1.1 謹慎
- 在字元類中,沒有匹配字串的概念。所以,如果你正在使用正規表示式
[cat]
,它並不意味著它應該字面上匹配cat
,但它意味著它應匹配c
或a
或t
。這是一個非常普遍的誤解,存在於正則表達的新人之間。 - 有時人們會在角色類中使用
|
(交替),認為它會像OR condition
那樣錯誤。例如,使用[a|b]
實際上意味著匹配a
或|
(字面意思)或b
。
2.字元類的範圍
字元類中的範圍使用 -
符號表示。假設我們想在英文字母 A
到 Z
中找到任何字元。這可以通過使用以下字元類來完成
[A-Z]
這可以針對任何有效的 ASCII 或 unicode 範圍進行。最常用的範圍包括 [A-Z]
,[a-z]
或 [0-9]
。此外,這些範圍可以在字元類中組合
[A-Za-z0-9]
這意味著匹配 A to Z
或 a to z
或 0 to 9
範圍內的任何字元。訂購可以是任何東西。因此,只要你定義的範圍正確,上述內容就相當於 [a-zA-Z0-9]
。
2.1 謹慎
-
有時候,當把
A
的範圍寫成Z
時,人們把它寫成[A-z]
。在大多數情況下這是錯誤的,因為我們使用的是z
而不是Z
。因此,這表示匹配從 ASCII 範圍65
(A)到122
(of z)的任何字元,其中包括 ASCII 範圍90
(Z)之後的許多非預期字元。但是,當為特定語言設定排序規則時,[A-z]
可用於匹配 POSIX 樣式正規表示式中的所有[a-zA-Z]
字母。在 Cygwin 上的[[ "ABCEDEF[]_abcdef" =~ ([A-z]+) ]] && echo "${BASH_REMATCH[1]}"
與LC_COLLATE="en_US.UTF-8"
產生了ABCEDF
。如果你把LC_COLLATE
設定為C
(在 Cygwin 上,用export
完成),它將給出預期的ABCEDEF[]_abcdef
。 -
-
在字元類中的含義是特殊的。它表示如上所述的範圍。*如果我們想要真正匹配-
字元怎麼辦?*我們不能把它放在任何地方,否則它將表示範圍,如果它放在兩個字元之間。在這種情況下,我們必須把-
放在像[-A-Z]
這樣的角色類的開頭,或者像[A-Z-]
或escape it
這樣的角色類的結尾,如果你想在像[A-Z\-a-z]
這樣的中間使用它。
3.否定字元類
否定字元類由 [^..]
表示。插入符號^
表示匹配除了字元類中存在的字元之外的任何字元。例如
[^cat]
意味著匹配除 c
或 a
或 t
之外的任何字元。
3.1 謹慎
- 插入符號
^
的含義只有在字元類的開頭才會對映到否定。如果它在字元類中的任何其他位置,它被視為字面插入字元,沒有任何特殊含義。 - 有些人寫的像
[^]
這樣的正規表示式。在大多數正規表示式引擎中,這會產生錯誤。原因是當你在起始位置使用^
時,它期望至少有一個字元應該被否定。但是在 JavaScript 中,這是一個有效的構造,它匹配任何東西,但沒有任何東西,即匹配任何可能的符號(但是變音符號,至少在 ES5 中)。