x = "abcdefg"
x = x.match(/ab(?:cd)ef/)
不应该是ab?事实并非如此,实际上是abcdef
为什么我的?:没有任何影响? (当然我的理解很可能是错的)
答案 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]
但真正的正则表达不适用于这种情况。