Frage

Gibt es eine Möglichkeit gibt, wenn zwei beliebige reguläre Ausdrücke äquivalent zu erfahren? Sieht aus wie komplexes Problem für mich, aber es könnte einige DFA Vereinfachung Mechanismus oder etwas sein?

War es hilfreich?

Lösung

Äquivalenz Um zu testen, können Sie die rel="noreferrer"> und vergleichen sie.

Andere Tipps

Testbarkeit der Gleichheit ist eine der klassischen Eigenschaften von regulären Ausdrücken. (N. B. Dies gilt nicht halten, wenn Sie wirklich reden Perl reguläre Ausdrücke oder eine andere technisch irreguläre superlanguage.)

Schalten Sie den REs zu verallgemeinern endlichen Automaten A und B, bauen dann einen neuen Automaten A-B, so dass die Annahme Zustände von A haben null Übergänge zu den Startzustände von B, und dass die Annahme Zustände von B invertiert. Dies gibt Ihnen einen Automaten, der diese Strings alle von A akzeptiert akzeptiert, mit Ausnahme derjenigen, akzeptiert von B.

Das gleiche für B-A, und reduziert sowohl reine FAs. Wenn ein FA keine Annahme zugängliche Zustände von einem Startzustand hat dann akzeptiert er die leere Sprache. Wenn Sie leer sind, dass sowohl A-B und B-A zeigen können, haben Sie, dass A = B gezeigt.

Edit Heh, ich kann nicht glauben, dass niemand den gigantischen Fehler bemerkte, dass es - ein beabsichtigt man natürlich :-P

Die Automaten A-B wie beschrieben werden diese Zeichenfolgen, deren erste Hälfte wird angenommen durch A und dessen zweite Hälfte wird nicht akzeptiert von B. Gebäude die gewünschte A-B ist ein etwas komplizierter Prozess übernehmen. Ich kann nicht glauben, der es aus der Spitze von meinem Kopf, aber ich weiß, es ist gut definiert (und beinhaltet wahrscheinlich Staaten die stellt die Produkte der Annahme von Staaten in A und Nicht-Annahme Staaten in B zu schaffen).

Das hängt davon ab, was Sie von regulären Ausdrücken bedeuten. Wie die anderen Plakate darauf hingewiesen, sollte beide Ausdrücke ihren minimalen DFA reduziert arbeiten, aber es funktioniert nur für die reine reguläre Ausdrücke.

Einige der Konstrukte in der realen Welt regex Libs verwendet (Rückreferenzierungen insbesondere) geben ihnen Macht Sprachen auszudrücken, die nicht regelmäßig sind, so dass der DFA-Algorithmus wird für sie nicht funktionieren. Zum Beispiel der Regex: Spiele ([a-z]*) \1 ein doppeltes Vorkommen des gleichen Wortes durch ein Leerzeichen getrennt (a a und b b aber b a noch a b nicht). Dies kann nicht durch einen endlichen Automaten erkannt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top