2009-01-06 16 views
8

Gibt es eine Möglichkeit zu testen, ob ein regulärer Ausdruck einen anderen regulären Ausdruck "enthält"?
Zum Beispiel:
regulärer Ausdruck "enthält" einen anderen regulären Ausdruck

RegEX1 = "a.*b"; 
RegEx2 = "a1.*b"; 

RegEX1 "enthält" RegEX2.

Soweit ich weiß - das kann nicht gemacht werden, liege ich falsch?


OK, Joel.Neely hat gezeigt, dass es getan werden kann (habe es noch nicht gelesen ...) akademisch.

Kann es in einer Programmiersprache gemacht werden, sagen wir C#?
Wie effektiv wird das sein? Wie lange dauert es, 1000 Paare zu testen?

Antwort

6

Ja.

This paper enthält eine detaillierte Diskussion des Themas (siehe Abschnitt 4.4).

+2

Können Sie Ihr "Ja" klären. Ich denke, Sie sagen "Ja, Sie haben Unrecht" und zitieren das Papier, das zeigt, wie es getan werden kann (aus einem kurzen Blick auf das Papier). Aber es wäre es wert, dies explizit zu buchstabieren. –

+1

Das erwähnte Papier sagt nur: "Es ist ein wohlbekanntes Ergebnis, dass für zwei reguläre Ausdrücke B und R leicht entscheidbar ist, ob B R subsumiert" und dann fortfährt, "Inhaltsmodelle" zu beschreiben. Außerdem scheint die Methode des Papiers einfach alle Strings mit der Länge Clueless

+1

Akzeptiert, obwohl es keinen praktischen Weg gibt, um ... – Dror

0

Die Umwandlung der beiden Ausdrücke in die entsprechenden Zustandsautomaten und die Überprüfung aller Pfade in beiden Maschinen ermöglichen die gleichen Übereinstimmungen, sollten den Trick tun. Die Pump-Lemme sollte offensichtlich darauf ausgerichtet sein, also vermeiden Sie alte Knoten erneut zu besuchen.

Es würde nur für "einfache" reguläre Ausdrücke funktionieren (oder real, was hast du, perls rekursive Ausdrücke sind viel ausdrucksvoller).

Während ein Graph der Zustandsmaschine eine große Anzahl von Pfaden haben kann, sollte er immer noch begrenzt sein (besonders wenn die Quelle für die Ausdrücke menschlich ist). Sie würden also alle zulässigen Pfade von RegEX1 finden und nacheinander prüfen, ob es in RegEX2 zulässig ist. Wenn alle Pfade gültig sind, wissen Sie, dass der eine in dem anderen enthalten ist.

+0

Ist es möglich (in einer angemessenen Zeit), einen Test auszuführen, um eine Hierarchie von regulären Ausdrücken zu erhalten (mehrere hundert von ihnen)? können Sie Zeiger auf Code bereitstellen, der das tut? – Dror

+0

Ich sehe nicht, warum es nicht möglich wäre, und in angemessener Zeit auch. Sie müssten dies jedoch von Grund auf neu aufbauen, was nicht trivial ist. – Svend

+0

die Prüfung "alle Wege sind gültig" für alle Paare würde wahrscheinlich sehr lange dauern. "Überprüfen Sie alle Pfade in beiden Maschinen", wie Sie sagen, kann unendlich sein, oder fehlt mir etwas? – Dror