Kann ich ein OP in Regex verwenden, ohne zu erfassen, was eingeschlossen ist?

115

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.

goggin13
quelle
Nice one +1 für den Link zu Rubular
Bukowski

Antworten:

181

Abhängig von der Implementierung des regulären Ausdrucks können Sie sogenannte nicht erfassende Gruppen mit der folgenden Syntax verwenden (?:…):

((?:a|b)c)

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)entweder acoder ist bc.

Gumbo
quelle
das hat es geschafft! Danke für die superschnelle Antwort. Ich akzeptiere nach Ablauf der Frist (von der ich nicht wusste, dass sie existiert).
Goggin13
4
Ich dachte, die Idee wäre nicht, das aoder büberhaupt zu erfassen . Mit anderen Worten, passen ac oder bcaber nur erfassen die c:(?:a|b)(c)
Alan Moore
1
@AlanMoore Ist es möglich, das eine und nicht das andere in der Anweisung oder zu erfassen? Also suche ich nach dem Muster acoder ab, aber ich möchte ausgeben, abwenn abund nur 'c' ausgegeben wird, ist 'ac'.
Moondra
24

Wenn Ihre Implementierung es hat, können Sie nicht erfassende Klammern verwenden:

(?:a|b)
Marc Mutz - mmutz
quelle
@mmutz Danke für die schnelle Antwort! Ich wünschte, ich könnte beide Antworten akzeptieren, das war genau das, wonach ich gesucht habe
goggin13
3

Selbst bei Rubularen werden keine Klammern verwendet, und die Priorität von |ist gering. Zum Beispiel stimmt a | bc nicht mit ccc überein

msw
quelle
Was macht der Operator '! ~'? Ich mag Ihren Ausdruck, mit weniger Parens, Regex ist schon chaotisch genug
goggin13
! ~ ist ein Perlismus für "passt nicht zusammen", es war schlampiges Schreiben meinerseits; behoben, danke.
Msw
2
Ich verstehe dich nicht Der niedrige Vorrang |ist , warum Sie tun , um den Einsatz Pars haben. (?:a|b)cÜbereinstimmungen acoder bc(das gewünschte Verhalten), während a|bcÜbereinstimmungen aoder bc.
Alan Moore
2

Wenn Ihre ODER-Alternativen nur aus einzelnen Zeichen bestehen, können Sie einfach den Operator "Zeichensatz" verwenden:

([ab]c)

es wird nur übereinstimmen acoder bcund es ist besser lesbar.

yrtimiD
quelle