正则表达式究竟做了什么?

时间:2018-04-25 03:50:20

标签: javascript regex

[]的正则表达式总是让我感到困惑。以下是使用/[0-9]/

的一些常见模式
  • /[A-Z]/捕获所有数字
  • /[a-z]/捕获所有26个大写字母
  • /[A-Za-z0-9]捕获所有26个小写字母

但是

  • /[0-z]捕获所有数字,大写字母和小写字母

也可以写成

  • ^,它还捕获所有数字,大写字母和小写字母。 但它也会捕获|/[0-z]以及其他字符

为什么会这样?

2 个答案:

答案 0 :(得分:5)

因为ASCII表

[A-Za-z0-9]捕获48到122之间的所有ASCII值

enter image description here

{{1}}不

enter image description here

答案 1 :(得分:2)

正则表达式中的[]表示字符集。它告诉模式匹配器匹配括号内出现的任何字符。所以,例如,

/[abc]/

将匹配'a''b''c'中的任何一个。

但是,在括号内,连字符('-')具有特殊含义:它表示在连字符(包括)之前和之后的字符之间的整个字符范围。也就是说,上面的正则表达式可以写成:

/[a-c]/

如果要在集合中的字符列表中包含文字连字符,则需要对其进行转义。那就是:

/[a\-c]/

将匹配'a''-''c'(而不是'b')中的任何一个。您还可以通过将连字符设置为集合中的第一个或最后一个字符来抑制连字符的特殊含义,所以:

/[-ac]/

也会匹配'a''-''c'中的任何一个。

这解释了为什么/[A-Za-z0-9]//[0-z]/不同的原因:'0''z'之间的字符范围只包含其他字符,正如您在问题中所述。这就是它的全部内容。

作为技术细节,Javascript使用Unicode标准来定义哪些字符属于某个范围。如果您坚持使用7位ASCII字符集,则使用ASCII图表可以获得相同的结果。但是,不要将ASCII图表用于0x7F以上的字符代码。您需要参考Unicode图表。