2

可能重复:
非捕获组?

我正在学习 JavaScript 中的正则表达式,而(?:x)字符或“非捕获括号”对我来说没有意义。如果您不想记住匹配项,为什么不完全放弃括号呢?using/(?:x)/而不是 just有什么好处/x/

4

4 回答 4

13

因为您可能出于其他原因需要括号。例如,假设您要捕获abababababab9. 如果你写了ab*(\d),那么它会匹配abbbbbbbbb9。您需要用括号括起来,ab以便*操作员重复整个过程。(ab)*(\d). 但也许你不在乎ab重复了多少次。那就是你使用的地方(?:)(?:ab)*(\d)

于 2012-07-10T14:08:15.757 回答
3

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

于 2012-07-10T14:05:29.547 回答
3

考虑以下情况:

(?:aa|bb|cc)

(?:abc)?

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

于 2012-07-10T14:06:32.560 回答
1

如果您不想记住匹配项,为什么不完全放弃括号呢?使用 /(?:x)/ 而不仅仅是 /x/ 有什么好处?

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

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

如果要实现匹配的模式foor并且fbar必须将字符分组在中间:

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

当然,您也可以分组并记住该组,但是如果test您的 usingmatch或返回数组的其他方法对您很重要,那么您必须改为使用(?:

于 2012-07-10T14:15:14.393 回答