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


116

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

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

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

(a|b)(c)

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

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


Ницца один +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 Спасибо за быстрый ответ! Хотел бы я принять оба ответа, это было именно то, что я искал
goggin13

3

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


что делает оператор '! ~'? Мне нравится ваше выражение, с меньшим количеством скобок, регулярное выражение уже достаточно беспорядочное
goggin13

! ~ это перлизм для "не совпадает", с моей стороны это было небрежно; исправлено, спасибо.
msw

2
Я тебя не понимаю. Низкий приоритет |- вот почему вам все же нужно использовать скобки. (?:a|b)cсоответствует acили bc(желаемое поведение), а a|bcсоответствует aили bc.
Алан Мур

2

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

([ab]c)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.