2016-04-26 18 views
3

In Worten übereinstimmen, würde ich das Problem so beschreiben „Spiel A oder B, Spiel foo und dann A oder B übereinstimmen, die zuvor nicht überein“.Regex Spiel, was nicht

Ich kann es mit dem folgenden regex tun:

AfooB|BfooA 

Ich frage mich, ob es eine effizientere Art und Weise, dies zu tun ist? Ich weiß, wie man eine eingefangene Gruppe unter Verwendung der "\" und dann der Gruppennummer referenziert. In diesem Fall möchte ich etwas wie "nicht die Option, die in der erfassten Gruppe übereinstimmte" anwenden (und immer noch darauf beschränkt sein, nur die anderen möglichen Übereinstimmungen für diese Gruppe zu treffen).

Der Grund, warum ich etwas effizienter als einfach "AfooB|BfooA" suchen, ist, dass in meinem Fall "foo" ist ein sehr langes Muster und ich würde es vorziehen, Verdoppelung wenn möglich zu reduzieren.

+0

Wenn der Titel andere besser beschrieben werden kann, bitte ändern zu helfen :) – RebamAsia1

Antwort

5

Sie können einen negativen Vorgriff-mit einer Rückreferenzierung Einschränkung verwenden, wenn die zweiten A oder B passende:

(A|B)foo(?!\1)(A|B) 

Grundsätzlich (A|B) Einstimmungen und erfaßt den Wert in der Gruppe 1, dann foo Streichhölzer foo, (?!\1) Fabrikate Stellen Sie sicher, dass der folgende Text nicht der gleiche ist wie der in der ersten Gruppe erfasste Text, und dass er nur den umgekehrten Wert mit (A|B) erreichen kann.

Siehe this regex demo

HINWEIS: Wenn A und B einzelne Zeichen sind, eine Zeichenklasse verwenden: ([AB])foo(?!\1)([AB])

+1

funktioniert wie ein Charme! Ich werde die Antwort in ein paar Minuten akzeptieren, wenn ich darf :) – RebamAsia1