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.


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.


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)

@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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.