正则表达式模式中,()和[]有什么区别?

74

在正则表达式中,使用圆括号 () 和方括号 [] 分别有什么区别?

以下代码:

[a-z0-9]

与此不同:

(a-z0-9)


7
请访问http://www.regular-expressions.info/。 - nickytonline
6个回答

82

[] 表示一个字符类。 () 表示捕获组。

[a-z0-9] -- 一个字符,位于a-z 或者 0-9 的范围内。

(a-z0-9) -- 明确捕获 a-z0-9。没有范围。

a -- 可以被 [a-z0-9] 捕获。

a-z0-9 -- 可以被 (a-z0-9) 捕获,并且可以在替换和/或表达式的后面引用。


3
这两个正则表达式/[\s+]?,[\s+]?//(\s+)?,(\s+)?/有所不同。第一个表达式使用了字符集,匹配零个或一个空白字符和逗号,然后再匹配零个或一个空白字符。而第二个表达式使用了捕获组,匹配零个或一个连续的空白字符和逗号,然后再匹配另一个零个或一个连续的空白字符。 - Muhammad Umer
1
第一个正则表达式使用字符类,第二个使用捕获组。这两个表达式实际上完全不同。第一个将匹配0或1个空格字符或+,后跟逗号,后跟0或1个空格字符或+。后者将匹配0个或多个空格字符,后跟逗号,后跟0个或多个空格字符。 - Jeff Rupert
所以,基本上,如果你有一个字符串如下:var myStr = ' , ',第一个表达式将不匹配,而第二个将匹配。如果你有另一个字符串如下:var myOtherStr = '+,',它将匹配第一个表达式但不匹配第二个表达式。 - Jeff Rupert
我以JS作为示例语言,但概念适用于大多数正则表达式。如果您想学习有关正则表达式的知识,http://www.regular-expressions.info 是一个很好的资源。=) - Jeff Rupert
1
在正则表达式的几乎所有版本中,+ 是一个特殊字符。然而,在字符组内部(即 [] 中的一组字符),+ 会被视为普通字符来匹配。 - Jeff Rupert
显示剩余5条评论

33

(…)是一个,它像数学中的分组一样将内容分组;(a-z0-9)a-z0-9的分组序列。组特别适用于量词符号,允许前面的表达式作为整体重复: a*b*匹配任意数量的a后跟任意数量的b,例如:aaaabbbbbb等。相比之下,(ab)*匹配任意数量的ab,例如:ababababab等。

[...]是一个字符类,描述了一个单个字符的选项;[a-z0-9]描述了一个单个字符可以是范围az09中的任何一个。


25

[]构造在正则表达式中本质上是所有内容的|的简写。例如,[abc]匹配a、b或c。此外,-字符在[]内具有特殊含义,它提供了一个范围构造。[a-z]将匹配任何字母a到z。

()构造是一个分组构造,建立了一个优先级顺序(它还影响访问匹配的子字符串,但这是一个更高级的主题)。正则表达式(abc)将匹配字符串"abc"。


8

[a-z0-9]将匹配任何小写字母或数字。(a-z0-9)将匹配精确字符串"a-z0-9"并允许两个附加项:您可以将修饰符如*?+应用于整个组,并且您可以在匹配后使用$1\1引用此匹配。虽然在您的示例中不实用。


0
尝试使用 ([a-z0-9]) 捕获混合的小写字母和数字字符串,并进行反向引用(或提取)。

-2

[a-z0-9]将匹配abcdefghijklmnopqrstuvwxyz0123456789中的一个字符。换句话说,方括号只匹配一个字符。

(a-z0-9)将匹配两个字符,第一个是abcdefghijklmnopqrstuvwxyz中的一个字符,第二个是0123456789中的一个字符,就好像没有括号一样。()将允许您准确地读取匹配的字符。括号还可用于使用竖线|字符对两个表达式进行OR运算。例如,(a-z|0-9)将匹配一个字符--任何小写字母或数字。


1
范围只存在于字符类中。(a-z|0-9)将匹配字符串a-z0-9,但不匹配a5 - Daniel Vandersluis
1
啊,谢谢你的澄清。([a-z]|[0-9])更符合我所描述的内容。 - levis501

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接