正则表达式,“只是组,不捕获”,似乎不起作用

时间:2010-03-29 23:06:58

标签: javascript regex

x = "abcdefg"
x = x.match(/ab(?:cd)ef/)

不应该是ab?事实并非如此,实际上是abcdef

为什么我的?:没有任何影响? (当然我的理解很可能是错的)

3 个答案:

答案 0 :(得分:26)

(?:...)匹配,它不会为\1 / $1 / .groups(1) /等创建新组。

答案 1 :(得分:5)

你的理解是错误的。该组仍然是主要捕获的一部分,但它不会被视为子表达式捕获。以下将返回两个匹配的数组:

x = "abcdefg"
x = x.match(/ab(cd)ef/)

数组索引0将是“abcdef”(完全匹配),数组索引1将是“cd”,即子表达式捕获。添加?:告诉正则表达式不关心捕获子表达式,完全匹配仍然完全捕获。

根据您的其他评论,您可以通过多种方式执行您要执行的操作。例如:

x.replace(/(ab)cd(ef)/, "$1$2");
x.slice(0, x.indexOf("cd")) + x.slice(x.indexOf("cd") + 2);

答案 2 :(得分:0)

除了其他回复之外,如果你真的需要只匹配正则表达式中的外部表达式,你必须做这样的事情:

x = "abcdefg"
xarr = x.match(/(ab)(?:cd)(ef)/)
x = xarr[1] + xarr[2]

但真正的正则表达不适用于这种情况。