Regular Expressions 字符类和初学者面临的常见问题

示例

1.角色类别

字符类用表示[]。字符类中的内容被视为single character separately。例如,假设我们使用

[12345]

在上面的示例中,它表示match 1 or 2 or 3 or 4 or 5。简而言之,可以理解为or condition for single characters(强调单个字符

1.1注意事项

  • 在字符类中,没有匹配字符串的概念。因此,如果您使用的是regex [cat],则并不意味着它应从cat字面上匹配该词,而是意味着它应与cora或匹配t。在正则表达式新手中这是一个非常普遍的误解。

  • 有时人们|在角色类中使用(替代),认为这样做会OR condition出错。例如,使用[a|b]实际是指matcha或|(字面上)或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。因此,这表示匹配从65(A)的ASCII范围到122(z)的任何字符,其中包括在90(Z)的ASCII范围之后的许多意外字符。但是,当为特定语言设置排序规则时,[A-z]可用于匹配[a-zA-Z]POSIX样式正则表达式中的所有字母。[[ "ABCEDEF[]_abcdef" =~ ([A-z]+) ]] && echo "${BASH_REMATCH[1]}"对CygwinLC_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中)。