(?:x)字符有什么意义?

时间:2012-07-10 14:03:51

标签: javascript regex

  

可能重复:
  Non capturing group?

我正在学习JavaScript中的正则表达式,(?:x)字符或“非捕获括号”对我来说没有意义。如果你不想记住这场比赛,为什么不完全放弃括号呢?使用/(?:x)/而不仅仅是/x/的优势是什么?

4 个答案:

答案 0 :(得分:11)

因为出于其他原因可能需要括号。例如,假设您要捕获abababababab9末尾的数字。如果您写了ab*(\d),那么它将匹配abbbbbbbbb9。您需要为ab加上括号,以便*运算符重复整个事情。 (ab)*(\d)。但也许你不关心ab被重复多少次。这就是您使用(?:)的地方:(?:ab)*(\d)

答案 1 :(得分:3)

您需要它来定义要在替代匹配或量词中使用的子模式,这些子模式将适用于整个子模式而不会浪费捕获槽。例如,您可以将(?:)|一起使用,在正则表达式中间提供备用匹配而不捕获它。

答案 2 :(得分:3)

考虑以下情况:

(?:aa|bb|cc)

(?:abc)?

您可以使用非捕获组来匹配具有更复杂子模式的模式。在某些情况下,使用非捕获组语法也会产生更有效的正则表达式。

答案 3 :(得分:1)

  

如果你不想记住这场比赛,为什么不放弃括号呢?使用/(?:x)/而不仅仅是/ x /?

有什么好处

当您想要分组字符时使用它,但您不想记住它们。如果删除括号,则无法对一系列字符进行分组。所以,例如:

/foo|bar/.test("foo") // true
/foo|bar/.test("bar") // true

如果您想要获得与foorfbar匹配的模式,您必须将字符分组到中间:

/f(?:oo|ba)r/.test("fbar") // true
/f(?:oo|ba)r/.test("foor") // true

当然您也可以对该组进行分组和记忆,但是如果您使用test或其他返回的数组对您来说很重要match,那么您必须使用{{1}而不是。