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.
regex
capture
regex-group
goggin13
źródło
źródło
Odpowiedzi:
W zależności od implementacji wyrażenia regularnego możesz użyć tak zwanych grup nieprzechwytywanych o składni
(?:…)
: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 alboac
albobc
.źródło
a
lubb
w ogóle. Innymi słowy, aby dopasowaćac
albobc
, ale tylko uchwycić sięc
:(?:a|b)(c)
ac
lubab
, ale chcę wyprowadzić,ab
jeśliab
i tylko „c” jest wyjściem „ac”.Jeśli Twoja implementacja to ma, możesz użyć nawiasów nieprzechwytujących:
źródło
Nawet rubular nie sprawia, że używasz nawiasów, a pierwszeństwo
|
jest niskie. Na przykład a | bc nie pasuje do cccźródło
|
to dlaczego nie trzeba używać parens.(?:a|b)c
pasujeac
lubbc
(pożądane zachowanie), podczas gdya|bc
pasujea
lubbc
.Jeśli wszystkie alternatywy OR to pojedyncze znaki - możesz po prostu użyć operatora „zestawu znaków”:
będzie pasować tylko
ac
lubbc
i będzie bardziej czytelny.źródło