角色类和初学者面临的常见问题
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 中)。