可能重复:
非捕获组?
我正在学习 JavaScript 中的正则表达式,而(?:x)
字符或“非捕获括号”对我来说没有意义。如果您不想记住匹配项,为什么不完全放弃括号呢?using/(?:x)/
而不是 just有什么好处/x/
?
可能重复:
非捕获组?
我正在学习 JavaScript 中的正则表达式,而(?:x)
字符或“非捕获括号”对我来说没有意义。如果您不想记住匹配项,为什么不完全放弃括号呢?using/(?:x)/
而不是 just有什么好处/x/
?
因为您可能出于其他原因需要括号。例如,假设您要捕获abababababab9
. 如果你写了ab*(\d)
,那么它会匹配abbbbbbbbb9
。您需要用括号括起来,ab
以便*
操作员重复整个过程。(ab)*(\d)
. 但也许你不在乎ab
重复了多少次。那就是你使用的地方(?:)
:(?:ab)*(\d)
。
您需要它来定义要在替代匹配或量词中使用的子模式,这将应用于整个子模式而不会浪费捕获槽。例如,您可以使用(?:)
with|
在 regexp 中间提供替代匹配而不捕获它。
考虑以下情况:
(?:aa|bb|cc)
(?:abc)?
您可以使用非捕获组来匹配具有更复杂子模式的模式。在某些情况下,使用非捕获组语法也会产生更有效的正则表达式。
如果您不想记住匹配项,为什么不完全放弃括号呢?使用 /(?: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
或返回数组的其他方法对您很重要,那么您必须改为使用(?:
。