2010-06-03 7 views
8

Wenn ich eine Liste von regulären Ausdrücken habe, gibt es eine einfache Möglichkeit festzustellen, dass keine von beiden eine Übereinstimmung für dieselbe Zeichenfolge zurückgibt?Gegenseitig exklusive reguläre Ausdrücke

Das heißt, die Liste ist gültig, wenn und nur dann, wenn für alle Strings maximal ein Element in der Liste wird die gesamte Zeichenfolge übereinstimmen.

Es scheint, wie dies sehr schwierig sein wird (vielleicht unmöglich?) Endgültig zu beweisen, aber ich kann keine Arbeiten zu diesem Thema zu finden scheinen.

Der Grund, warum ich frage, ist, dass ich an einem Tokenizer arbeite, der Regex akzeptiert, und ich möchte sicherstellen, dass immer nur ein Token dem Kopf der Eingabe entsprechen kann.

+0

möglich Duplikat [Wie kann man erkennen, ob zwei reguläre Ausdrücke in den Saiten überlappen können sie übereinstimmen?] (Http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular -Ausdrücke-Overlap-in-the-Strings-sie-können-Matte) –

+0

Ich denke, ich missverstanden. Sie meinen, dass zwei gegebene reguläre Ausdrücke vollständig gegenseitig zu * jeder * Eingabestring exklusiv sein muss? Das heißt, dass von 2^32 möglichen Vier-Byte-Strings eine Regex nur eine Möglichkeit erfüllen kann?Ist das nicht das Gleiche wie zu sagen: passen Sie genau diese Zeichenfolge an? – Abel

+0

Ich meine, der Schnittpunkt der Regexe muss Null sein. Keine Zeichenfolge entspricht mehr als 1 Regex. – captncraig

Antwort

5

Wenn Sie mit reinen regulären Ausdrücken (keine Rückreferenzierungen oder andere Merkmale, die sie verursachen kontextfreie oder kompliziertere Sprachen erkennen) arbeiten, was Sie fragen, ist möglich. Sie können jeden Regex in einen DFA konvertieren und dann (da reguläre Sprachen unter Kreuzungen geschlossen sind) diese zu einem DFA kombinieren, der den Schnittpunkt der beiden Sprachen erkennt. Wenn dieser DFA über einen Pfad vom Startstatus in einen akzeptierenden Status verfügt, wird dieser String von beiden Eingabe-Regexen akzeptiert.

Das Problem dabei ist, dass der erste Schritt der üblichen Regex-> DFA-Algorithmus zu konvertieren Sie die Regex zu einem NFA, dann konvertieren Sie die NFA zu einem DFA. Aber dieser letzte Schritt kann zu einem exponentiellen Anstieg in der Anzahl der DFA-Zustände führen, so dass dies für sehr einfache reguläre Ausdrücke nur möglich ist.

Wenn Sie mit erweiterter Regex-Syntax arbeiten, sind alle Wetten deaktiviert: kontextfreie Sprachen sind nicht unter Kreuzung geschlossen, so dass diese Methode nicht funktioniert.

+0

Faszinierender Gedanke. Ich glaube, du überquerst effektiv Schwerter mit Jeffrey Friedl, der sagte (Seite 157) "Über DFA-Matching zu sprechen ist sehr langweilig". Du hast es gerade wieder interessant gemacht (akzeptiere, dass DFA dich immer noch stark einschränkt)! – Abel

+0

Das habe ich befürchtet. Sehr interessante Antwort. – captncraig

1

Die Wkipedia article on regular expressions tut Zustand

Es ist möglich, einen Algorithmus, der für zwei gegebene reguläre Ausdrücke schreiben entscheidet, ob die beschriebenen Sprachen im Wesentlichen gleich sind, jeden Ausdruck auf einen minimalen deterministischen endlichen Automaten verringert, und bestimmt, ob sie sind isomorph (äquivalent).

gibt aber keine weiteren Hinweise.

Natürlich ist die einfache Möglichkeit, sind Sie nach ist eine Menge Tests laufen - aber wir alle wissen, die Mängel der Tests als Methode des Beweises.

+1

Ich glaube, CaptnCraig will wissen, ob die Sprachen eine nicht leere Kreuzung haben, nicht ob sie identisch sind. –

1

Sie können das nicht tun, indem Sie nur auf den regulären Ausdruck schauen.

Betrachten wir den Fall, wo Sie [0-9] und [0-9]+ haben. Sie sind offensichtlich verschiedene Ausdrücke, aber wenn sie auf die Zeichenkette "1" angewendet werden, erzeugen beide das gleiche Ergebnis. Wenn sie auf die Zeichenfolge "11" angewendet werden, erzeugen sie unterschiedliche Ergebnisse.

Der Punkt ist, dass ein regulärer Ausdruck nicht genug Informationen ist. Das Ergebnis hängt sowohl von der Regex- als auch von der Zielzeichenfolge ab.

+0

* "Wenn sie auf die Zeichenkette" 11 "angewendet werden, erzeugen sie unterschiedliche Ergebnisse." * Tatsächlich: sie haben nicht das gleiche Ergebnis. Es sei denn, Sie fügen Verankerung hinzu. – Abel

+0

Für reine reguläre Ausdrücke, was CaptnCraig fragt, ist möglich (aber möglicherweise ineffizient). Er möchte wissen, ob zwei reguläre Sprachen (durch reguläre Ausdrücke angegeben) eine nicht leere Schnittmenge haben. Für Ihr Beispiel lautet die Antwort "Ja". –

+0

@Abel: Ich denke, was er meinte ist, dass der Teil der Saite, mit dem sie übereinstimmen, anders ist. Sie werden beide jedoch übereinstimmen. –