Могу ли я использовать OR в регулярном выражении без захвата того, что заключено?

116

Я использую rubular.com для создания своего регулярного выражения, и их документация описывает следующее:

(...)   Capture everything enclosed
(a|b)   a or b

Как я могу использовать выражение ИЛИ, не записывая, что в нем содержится? Например, скажем, я хочу захватить либо «ac», либо «bc». Я не могу использовать регулярное выражение

(a|b)(c)

право? С тех пор я фиксирую либо «a», либо «b» в одной группе и «c» в другой, но не одно и то же. Я знаю, что могу фильтровать полученные результаты, но это похоже на дополнительную работу ...

Я упускаю что-то очевидное? Я использую это в Java, если это уместно.

goggin13
источник
Ницца один +1 за ссылку на Rubular
Буковски

Ответы:

182

В зависимости от реализации регулярного выражения вы можете использовать так называемые группы без захвата с синтаксисом (?:…):

((?:a|b)c)

Вот (?:a|b)группа, но вы не можете указать ее совпадение. Таким образом, вы можете ссылаться только на ((?:a|b)c)то, что соответствует либо acили bc.

гумбо
источник
вот и получилось! Спасибо за сверхбыстрый ответ. Я приму предложение после истечения срока (о существовании которого я не знал).
goggin13
4
Я думал, что идея заключалась не в том, чтобы захватить aили bвообще. Другими словами, чтобы соответствовать ac или bc, но только захватить в c:(?:a|b)(c)
Алан Мур
1
@AlanMoore Можно ли захватить одно, а не другое в операторе или? Итак, я ищу шаблон acили ab, но я хочу вывести, abесли abи только 'c' выводится как 'ac'.
Moondra
24

Если в вашей реализации он есть, вы можете использовать круглые скобки без захвата:

(?:a|b)
Марк Мутц - mmutz
источник
@mmutz Спасибо за быстрый ответ! Хотел бы я принять оба ответа, это было именно то, что я искал
goggin13
3

Даже rubular не заставляет вас использовать круглые скобки, а приоритет |низкий. Например, a | bc не соответствует ccc

MSW
источник
что делает оператор '! ~'? Мне нравится ваше выражение, с меньшим количеством скобок, регулярное выражение уже достаточно беспорядочное
goggin13
! ~ это перлизм для "не совпадает", с моей стороны это было небрежно; исправлено, спасибо.
msw
2
Я тебя не понимаю. Низкий приоритет |- вот почему вам все же нужно использовать скобки. (?:a|b)cсоответствует acили bc(желаемое поведение), а a|bcсоответствует aили bc.
Алан Мур
2

Если все ваши альтернативы OR являются одиночными символами, вы можете просто использовать оператор "набора символов":

([ab]c)

он будет соответствовать только acили, bcи он будет более читаемым.

yrtimiD
источник