Регулярное выражение: не включать подстроку в группу - PullRequest
0 голосов
/ 03 апреля 2011

Мне интересно, возможно ли исключить часть совпадения в группе.

Я считаю, что /(foo((?:bar)|(bad)))/ приводит к совпадению "foobar" или "foobad" и группы 1, содержащей "foobar"или "foobad".Я бы хотел, чтобы он совпадал с "foobar" или "foobad", но группа 1 содержит только "foo" или "foobad".Я знаю, что синтаксис (?:...) regex используется для создания группы, на которую вы не сможете ссылаться позже, но приведенное выше использование означает, что существует 3 группы: \ 1 полное соответствие;\ 2 либо «бар», либо «плохо»;\ NONE - неиспользуемая группа 'bar';и \ 3 за «плохо».

Вы видите, куда я иду?Я хочу по желанию исключить подгруппу из другой группы.

В качестве альтернативы, я хотел бы определить группу 1 дважды ИЛИ способом /(foobar)|(foobad)/, хотя я знаю, что ввод не будет выполнять то, что я хотел.В этом случае попытка получить доступ к match[1] приведет к ошибке «undefined», если в качестве входных данных будет указано «foobad».Я знаю, что это потому, что он фактически разбивает его на группу 1 и / или группу 2.

Я пишу это на диалекте регулярных выражений javascript.

Ответы [ 3 ]

4 голосов
/ 03 апреля 2011

Я бы хотел, чтобы он совпадал с "foobar" или "foobad", но группа 1 содержит только "foo" или "foobad".

Регулярное выражение:

/(foo(?:(?=bar)|bad))/

делает это: группа 1 либо содержит foo (только если bar идет сразу после нее), либо содержит foobad.

0 голосов
/ 03 апреля 2011

Это близко к тому, что вы хотите

/((?=foobar)foo|foobad)/

это отдельная группа, которая соответствует либо foo (но только если начать с того, что она будет соответствовать foobar) или foobad.Форма (?=...) является предварительным утверждением нулевой ширины.

Это не совсем то, что вы хотите, потому что совпадение в случае foobar это просто foo, но IMO, чтобы иметь возможностьсоответствует foobar, но группировка только foo в той же группе, где foobad будет сопоставлен, вместо этого требует lookbehind и AFAIK она не доступна в javascript.

0 голосов
/ 03 апреля 2011

(?:bar) - Соответствует bar , но не запоминает совпадение. Они называются не захватывающими скобками . Соответствующая подстрока не может быть вызвана из элементов результирующего массива [1], ..., [n] или из свойств предопределенного объекта RegExp $1, ..., $9.

Дополнительная информация: Центр разработчиков Mozilla .

...