Чи можу я використовувати АБО в регулярному виразі, не захоплюючи те, що додається?


115

Я використовую rubular.com для створення мого регексу , а їх документація описує наступне:

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

Як я можу використовувати ІЛИ вираз, не фіксуючи те, що в ньому? Наприклад, скажіть, що я хочу захопити або "ac", або "bc". Я не можу використовувати регулярний вираз

(a|b)(c)

правильно? Відтоді я фіксую або "a", або "b" в одній групі, і "c" в іншій, не те саме. Я знаю, що я можу фільтрувати отримані результати, але це, здається, більше роботи ...

Невже я пропускаю щось очевидне? Я використовую це на Java, якщо це доречно.


Приємний один +1 за посилання на рубуляр
bukowski

Відповіді:


181

Залежно від регулярної реалізації виразу, ви можете використовувати так звані групи, що не захоплюють, із синтаксисом (?:…):

((?: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".
Мондра

24

Якщо у вашої реалізації є, ви можете використовувати круглі дужки, що не фіксують:

(?:a|b)

@mmutz Дякую за швидку відповідь! Я б хотів, щоб я міг прийняти обидві відповіді, це було саме те, що я шукав
goggin13

3

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


що робить оператор '! ~'? Мені подобається твій вираз, з меншою кількістю парень, регулярний вираз вже досить безладний
goggin13

! ~ - це перлізм для "не відповідає", це було неохайно написане з мого боку; виправлено, спасибі
msw

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

2

Якщо Вашими альтернативами АБО є всі одиничні символи - ви можете просто скористатися оператором "набір символів":

([ab]c)

він буде відповідати тільки acчи bcй це більш зручним для читання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.