165 Stimmen

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

Ich benutze rubular.de um meine Regex zu erstellen, und ihre Dokumentation beschreibt das Folgende:

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

Wie kann ich einen OR-Ausdruck verwenden, ohne zu erfassen, was er enthält? Ein Beispiel: Ich möchte entweder "ac" oder "bc" erfassen. Ich kann die Regex nicht verwenden

(a|b)(c)

oder? Seitdem erfasse ich entweder "a" oder "b" in einer Gruppe und "c" in einer anderen, nicht in derselben. Ich weiß, dass ich durch die erfassten Ergebnisse filtern kann, aber das scheint mehr Arbeit zu sein...

Übersehe ich etwas Offensichtliches? Ich verwende dies in Java, wenn das relevant ist.

0 Stimmen

Gut gemacht +1 für den Link zu rubular

265voto

Gumbo Punkte 617646

Abhängig von der Implementierung des regulären Ausdrucks können Sie die so genannten nicht fangende Gruppen mit der Syntax (?:…) :

((?: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 von ((?:a|b)c) das ist entweder ac o bc .

0 Stimmen

Das war's! Danke für die superschnelle Antwort. Ich werde nach Ablauf der Frist (von der ich nicht wusste, dass sie existiert) akzeptieren.

5 Stimmen

Ich dachte, es ginge nicht um die Erfassung der a o b überhaupt nicht. Mit anderen Worten, um Spiel ac o bc sondern nur erfassen die c : (?:a|b)(c)

1 Stimmen

@AlanMoore Ist es möglich, das eine und nicht das andere in der oder-Anweisung zu erfassen? Ich suche also nach dem Muster ac o ab aber ich möchte Folgendes ausgeben ab wenn ab und nur "c" wird als "ac" ausgegeben.

38voto

Marc Mutz - mmutz Punkte 23597

Wenn Ihre Implementierung darüber verfügt, können Sie nicht-einfangende Klammern verwenden:

(?:a|b)

0 Stimmen

@mmutz Danke für die schnelle Antwort! Ich wünschte, ich könnte beide Antworten akzeptieren, das war genau das, wonach ich gesucht habe

9voto

yrtimiD Punkte 485

Wenn Ihre ODER-Alternativen alle einzelne Zeichen sind, können Sie einfach den Operator "Zeichensatz" verwenden:

([ab]c)

wird es nur mit ac o bc und es ist besser lesbar.

3voto

msw Punkte 41469

Selbst Rubular zwingt Sie nicht, Klammern zu verwenden, und der Vorrang von | niedrig ist. Zum Beispiel a|bc stimmt nicht mit ccc überein

0 Stimmen

Was bewirkt der Operator '!~'? Ich mag deinen Ausdruck, mit weniger Parens, regex ist schon chaotisch genug

0 Stimmen

!~ ist ein Perlismus für "stimmt nicht überein", es war eine Schlamperei meinerseits; korrigiert, danke.

5 Stimmen

Ich versteh dich nicht. Der niedrige Stellenwert von | ist der Grund, warum Sie tun müssen Parens verwenden. (?:a|b)c passt zu ac o bc (das gewünschte Verhalten), während a|bc passt zu a o bc .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X