Регулярное выражение "просто группа, не захватывает", похоже, не работает

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

не должно быть x beef? это не так, это фактически abcdef

Почему это так?: не имеет никакого эффекта? (конечно, мое понимание вполне может быть ошибочным)

Ответы

Ответ 1

(?:...) по-прежнему соответствует, он просто не создает новую группу для целей \1/$1/.groups(1)/etc.

Ответ 2

Ваше понимание неверно. Группа по-прежнему будет частью основного захвата, но она не будет учитываться как захват суб-выражения. Следующее вернет массив из двух совпадений:

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);

Ответ 3

В дополнение к другим ответам, если вам действительно нужно сопоставить только внешние выражения в регулярном выражении, вам нужно будет сделать что-то вроде этого:

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

Но реально это выражение не предназначено для этого случая.