Ответ 1
(?:...)
по-прежнему соответствует, он просто не создает новую группу для целей \1
/$1
/.groups(1)
/etc.
x = "abcdefg"
x = x.match(/ab(?:cd)ef/)
не должно быть x beef? это не так, это фактически abcdef
Почему это так?: не имеет никакого эффекта? (конечно, мое понимание вполне может быть ошибочным)
(?:...)
по-прежнему соответствует, он просто не создает новую группу для целей \1
/$1
/.groups(1)
/etc.
Ваше понимание неверно. Группа по-прежнему будет частью основного захвата, но она не будет учитываться как захват суб-выражения. Следующее вернет массив из двух совпадений:
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);
В дополнение к другим ответам, если вам действительно нужно сопоставить только внешние выражения в регулярном выражении, вам нужно будет сделать что-то вроде этого:
x = "abcdefg"
xarr = x.match(/(ab)(?:cd)(ef)/)
x = xarr[1] + xarr[2]
Но реально это выражение не предназначено для этого случая.