可能重复:
Non capturing group?
我正在学习JavaScript中的正则表达式,(?:x)
字符或“非捕获括号”对我来说没有意义。如果你不想记住这场比赛,为什么不完全放弃括号呢?使用/(?:x)/
而不仅仅是/x/
的优势是什么?
答案 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
如果您想要获得与foor
和fbar
匹配的模式,您必须将字符分组到中间:
/f(?:oo|ba)r/.test("fbar") // true
/f(?:oo|ba)r/.test("foor") // true
当然您也可以对该组进行分组和记忆,但是如果您使用test
或其他返回的数组对您来说很重要match
,那么您必须使用{{1}而不是。