(?:x) 字符的意义何在

What is the point of the (?:x) character?

本文关键字:字符      更新时间:2023-09-26

可能的重复项:
非捕获组?

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

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

考虑以下情况:

(?:aa|bb|cc)

(?:abc)?

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

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

如果您不想记住比赛,为什么不完全放弃括号呢?使用/(?: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或其他方法返回的数组对您很重要,那么您必须改用(?: