角色類和初學者面臨的常見問題

1.人物類

字元類由 [] 表示。字元類中的內容被視為 single character separately。例如,假設我們使用

[12345]

在上面的例子中,它意味著匹配 1 or 2 or 3 or 4 or 5。簡單來說,它可以理解為 or condition for single characters對單個字元的壓力

1.1 謹慎

  • 在字元類中,沒有匹配字串的概念。所以,如果你正在使用正規表示式 [cat],它並不意味著它應該字面上匹配 cat,但它意味著它應匹配 cat。這是一個非常普遍的誤解,存在於正則表達的新人之間。
  • 有時人們會在角色類中使用|(交替),認為它會像 OR condition 那樣錯誤。例如,使用 [a|b] 實際上意味著匹配 a|(字面意思)或 b

2.字元類的範圍

字元類中的範圍使用 - 符號表示。假設我們想在英文字母 AZ 中找到任何字元。這可以通過使用以下字元類來完成

[A-Z]

這可以針對任何有效的 ASCII 或 unicode 範圍進行。最常用的範圍包括 [A-Z][a-z][0-9]。此外,這些範圍可以在字元類中組合

[A-Za-z0-9]

這意味著匹配 A to Za to z0 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]

意味著匹配除 cat 之外的任何字元。

3.1 謹慎

  • 插入符號^的含義只有在字元類的開頭才會對映到否定。如果它在字元類中的任何其他位置,它被視為字面插入字元,沒有任何特殊含義。
  • 有些人寫的像 [^] 這樣的正規表示式。在大多數正規表示式引擎中,這會產生錯誤。原因是當你在起始位置使用^時,它期望至少有一個字元應該被否定。但是在 JavaScript 中,這是一個有效的構造,它匹配任何東西,但沒有任何東西,即匹配任何可能的符號(但是變音符號,至少在 ES5 中)。