2010-07-31 2 views
58

Ich verwende rubular.com meine regex zu bauen, und ihre Dokumentation beschreibt die folgenden:Kann ich ein OR in Regex verwenden, ohne zu erfassen, was beigefügt ist?

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

Wie kann ich eine OR-Ausdruck verwenden, ohne die Erfassung, was drin ist? Also, wenn ich „von einer c gefolgt a oder b“ entsprechen soll, und nur die c erfassen, kann ich nicht

(a|b)(c) 

richtig benutzen? Dann nehme ich sowohl das "a oder b" als auch das "c" auf. Ich weiß, dass ich durch die gefangenen Ergebnisse filtern kann, aber das scheint mehr Arbeit zu sein ...

Fehle ich etwas Offensichtliches? Ich benutze das in Java, wenn das relevant ist.

+0

Nice one +1 für die Verbindung zu Rubular – fjckls

Antwort

97

Je nach der regulären Ausdruck Implementierung können Sie verwenden, so nicht-einfangenden Gruppen mit der Syntax (?:…) genannt:

((?:a|b)c) 

Hier (?:a|b) eine Gruppe ist, aber man kann nicht sein Spiel verweisen. Sie können also nur auf die Übereinstimmung ((?:a|b)c) verweisen, die entweder ac oder bc ist.

+0

, die es getan hat! Danke für die super schnelle Antwort. Ich werde akzeptieren, nachdem das Zeitlimit (von dem ich nicht wusste, dass es existiert) abläuft. – goggin13

+3

Ich dachte, die Idee wäre nicht das "a" oder "b" zu erfassen. Mit anderen Worten, um * "ac" oder "bc" zusammenzufassen, aber nur * capture * das 'c':' (?: A | b) (c) ' –

+0

@AlanMoore Ist es möglich, einen zu erfassen und nicht den andere in der oder Aussage? Also suche ich nach dem Muster "ac" oder "ab", aber ich möchte "ab" ausgeben, wenn "ab" und nur "c" ausgegeben wird, ist "ac". – Moondra

13

Wenn Ihre Implementierung hat, dann können Sie nicht-einfangenden Klammern verwenden:

(?:a|b) 
+0

@mmutz Danke für die schnelle Antwort! Ich wünschte, ich könnte beide Antworten akzeptieren, das war genau das, was ich suchte – goggin13

1

Auch Rubular nicht machen Sie Klammern und der Vorrang des | verwenden ist gering. Zum Beispiel a|bc does not match ccc

+0

Was macht der '! ~' Operator? Ich mag deinen Ausdruck, mit weniger Parens, Regex ist schon chaotisch genug – goggin13

+0

! ~ Ist ein Perlismus für "stimmt nicht überein", es war schlampig Schreiben von meinem Teil; behoben, danke. – msw

+0

Gotcha; Danke für den Link! – goggin13

Verwandte Themen