Ich verwende rubular.com , um meinen regulären Ausdruck zu erstellen, und die Dokumentation beschreibt Folgendes:
(...) Capture everything enclosed
(a|b) a or b
Wie kann ich einen ODER-Ausdruck verwenden, ohne zu erfassen, was darin enthalten ist? Angenommen, ich möchte entweder "ac" oder "bc" erfassen. Ich kann den regulären Ausdruck nicht verwenden
(a|b)(c)
richtig? Seitdem erfasse ich entweder "a" oder "b" in einer Gruppe und "c" in einer anderen, nicht die gleiche. Ich weiß, dass ich durch die erfassten Ergebnisse filtern kann, aber das scheint mehr Arbeit zu sein ...
Vermisse ich etwas Offensichtliches? Ich benutze dies in Java, wenn das relevant ist.
regex
capture
regex-group
goggin13
quelle
quelle
Antworten:
Abhängig von der Implementierung des regulären Ausdrucks können Sie sogenannte nicht erfassende Gruppen mit der folgenden Syntax verwenden
(?:…)
:Hier
(?:a|b)
ist eine Gruppe, aber Sie können nicht auf ihre Übereinstimmung verweisen. Sie können also nur auf die Übereinstimmung verweisen, die((?:a|b)c)
entwederac
oder istbc
.quelle
a
oderb
überhaupt zu erfassen . Mit anderen Worten, passenac
oderbc
aber nur erfassen diec
:(?:a|b)(c)
ac
oderab
, aber ich möchte ausgeben,ab
wennab
und nur 'c' ausgegeben wird, ist 'ac'.Wenn Ihre Implementierung es hat, können Sie nicht erfassende Klammern verwenden:
quelle
Selbst bei Rubularen werden keine Klammern verwendet, und die Priorität von
|
ist gering. Zum Beispiel stimmt a | bc nicht mit ccc übereinquelle
|
ist , warum Sie tun , um den Einsatz Pars haben.(?:a|b)c
Übereinstimmungenac
oderbc
(das gewünschte Verhalten), währenda|bc
Übereinstimmungena
oderbc
.Wenn Ihre ODER-Alternativen nur aus einzelnen Zeichen bestehen, können Sie einfach den Operator "Zeichensatz" verwenden:
es wird nur übereinstimmen
ac
oderbc
und es ist besser lesbar.quelle