Czy mogę użyć OR w wyrażeniu regularnym bez przechwytywania tego, co jest dołączone?

115

Używam rubular.com do tworzenia mojego wyrażenia regularnego, a ich dokumentacja zawiera następujące informacje:

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

Jak mogę użyć wyrażenia OR bez przechwytywania tego, co się w nim znajduje? Na przykład powiedz, że chcę przechwycić „ac” lub „bc”. Nie mogę użyć wyrażenia regularnego

(a|b)(c)

dobrze? Od tego czasu wychwytuję „a” lub „b” w jednej grupie, a „c” w drugiej, a nie to samo. Wiem, że mogę przefiltrować przechwycone wyniki, ale wydaje się, że wymaga więcej pracy ...

Czy brakuje mi czegoś oczywistego? Używam tego w Javie, jeśli to ma znaczenie.

goggin13
źródło
Niezłe +1 za link do rubulara
bukowski

Odpowiedzi:

181

W zależności od implementacji wyrażenia regularnego możesz użyć tak zwanych grup nieprzechwytywanych o składni (?:…):

((?:a|b)c)

Oto (?:a|b)grupa, ale nie możesz odwołać się do jej dopasowania. Możesz więc odwołać się tylko do dopasowania, ((?:a|b)c)które to albo acalbo bc.

Gumbo
źródło
to zrobiło to! Dzięki za super szybką odpowiedź. Przyjmuję po upływie terminu (o którym nie wiedziałem).
goggin 13
4
Pomyślałem, że nie chodziło o to, aby uchwycić alub bw ogóle. Innymi słowy, aby dopasować ac albo bc, ale tylko uchwycić się c:(?:a|b)(c)
Alan Moore
1
@AlanMoore Czy można uchwycić jedną, a nie drugą w instrukcji lub? Więc szukam wzorca aclub ab, ale chcę wyprowadzić, abjeśli abi tylko „c” jest wyjściem „ac”.
Moondra
24

Jeśli Twoja implementacja to ma, możesz użyć nawiasów nieprzechwytujących:

(?:a|b)
Marc Mutz - mmutz
źródło
@mmutz Dzięki za szybką odpowiedź! Chciałbym móc zaakceptować obie odpowiedzi, właśnie tego szukałem
goggin13
3

Nawet rubular nie sprawia, że ​​używasz nawiasów, a pierwszeństwo |jest niskie. Na przykład a | bc nie pasuje do ccc

msw
źródło
co robi operator '! ~'? Podoba mi się twoja ekspresja, z mniejszą liczbą parenów, regex jest już wystarczająco niechlujny
goggin13
! ~ to perlizm na „nie pasuje”, to było niechlujne pisanie z mojej strony; naprawione, dzięki.
msw,
2
Nie rozumiem cię. Niski pierwszeństwo |to dlaczego nie trzeba używać parens. (?:a|b)cpasuje aclub bc(pożądane zachowanie), podczas gdy a|bcpasuje alub bc.
Alan Moore
2

Jeśli wszystkie alternatywy OR to pojedyncze znaki - możesz po prostu użyć operatora „zestawu znaków”:

([ab]c)

będzie pasować tylko aclub bci będzie bardziej czytelny.

yrtimiD
źródło