可能重复:
非捕获组?
我正在学习 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或返回数组的其他方法对您很重要,那么您必须改为使用(?:。