角色类和初学者面临的常见问题

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 中)。