Регулярное выражение «просто группа, не захватывать», похоже, не работает - PullRequest
16 голосов
/ 30 марта 2010
x = "abcdefg"
x = x.match(/ab(?:cd)ef/)

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

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

Ответы [ 3 ]

26 голосов
/ 30 марта 2010

(?:...) все еще соответствует , просто не создается новая группа для целей \1 / $1 / .groups(1) / и т. Д.

5 голосов
/ 30 марта 2010

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

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);
0 голосов
/ 30 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...