Могу ли я использовать ИЛИ в регулярных выражениях, не захватывая то, что включено? - PullRequest
90 голосов
/ 31 июля 2010

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

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

Как я могу использовать выражение OR, не фиксируя, что в нем?Например, скажем, я хочу захватить или «AC» или «BC».Я не могу использовать регулярное выражение

(a|b)(c)

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

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

Ответы [ 3 ]

144 голосов
/ 31 июля 2010

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

((?:a|b)c)

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

18 голосов
/ 31 июля 2010

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

(?:a|b)
1 голос
/ 31 июля 2010

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

...