Bibliothek, um zu prüfen, ob zwei reguläre Ausdrücke gleich/isomorph sind [closed]

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer1255384

Ich brauche eine Bibliothek, die zwei reguläre Ausdrücke aufnimmt und bestimmt, ob sie isomorph sind (dh genau denselben Satz von Strings abgleichen oder nicht). Zum Beispiel ist a|b isomorph zu [ab]

So wie ich es verstehe, kann ein regulärer Ausdruck in einen NFA konvertiert werden, der in einigen Fällen effizient in einen DFA konvertiert werden kann. Der DFA kann dann in einen minimalen DFA umgewandelt werden, der, wenn ich es richtig verstehe, einzigartig ist, und daher können diese minimalen DFAs dann auf Gleichheit verglichen werden. Mir ist klar, dass nicht alle NFAs mit regulären Ausdrücken effizient in DFAs umgewandelt werden können (insbesondere wenn sie aus Perl Regexps generiert wurden, die nicht wirklich “regulär” sind). In diesem Fall würde die Bibliothek idealerweise nur einen Fehler oder einen anderen Hinweis darauf zurückgeben, dass die Konvertierung ist nicht möglich.

Ich sehe online unzählige Artikel und wissenschaftliche Arbeiten darüber (und sogar einige Programmieraufgaben für Klassen, in denen die Schüler dazu aufgefordert werden), aber ich kann anscheinend keine Bibliothek finden, die diese Funktionalität implementiert. Ich würde eine Python- und/oder C/C++-Bibliothek bevorzugen, aber eine Bibliothek in einer beliebigen Sprache reicht aus. Weiß jemand, ob eine solche Bibliothek? Wenn nicht, kennt jemand eine nahe gelegene Bibliothek, die ich als Ausgangspunkt verwenden kann?

  • Nein. Es ist Teil eines Forschungsprojekts. Aber das ist nicht der Kern des Projekts, also würde ich lieber nicht die Zeit damit verbringen, meine eigene zu rollen, wenn ich nicht muss.

    – Benutzer1255384

    7. März 2012 um 18:37 Uhr

  • Ich habe nur Spaß gemacht. Das ist eine sehr gute Frage. Also +1.

    Benutzer405725

    7. März 2012 um 18:43 Uhr

  • Tatsächlich sollten die minimalen DFAs nicht direkt auf Gleichheit verglichen werden, aber sie können auf Graphisomorphie verglichen werden, um die Äquivalenz zu bestimmen.

    – Fred Foo

    7. März 2012 um 21:05 Uhr


Benutzer-Avatar
Benutzer1071136

Habe es nicht probiert, aber Regexp:Vergleiche für Perl sieht vielversprechend aus: Zwei Regex sind äquivalent, wenn die Sprache der ersten eine Teilmenge der zweiten ist, und umgekehrt.

  • Ich habe mir das angesehen und es sieht so aus, als ob es genau das tut, was ich will. Ich kann bei einem flüchtigen Blick auf den Code nicht sagen, wie es das macht, aber es hat in allen einfachen Fällen funktioniert, in denen ich es getestet habe. Danke für den Hinweis!

    – Benutzer1255384

    8. März 2012 um 18:40 Uhr


Benutzer-Avatar
ChrisBlom

Das brics Automatenbibliothek für Java unterstützt dies. Es kann verwendet werden, um reguläre Ausdrücke in minimale deterministische Finite-State-Automaten umzuwandeln und zu prüfen, ob diese äquivalent sind:

public static void isIsomorphic(String regexA, String regexB) {
    Automaton a = new RegExp(regexA).toAutomaton();
    Automaton b = new RegExp(regexB).toAutomaton();
    return a.equals(b);
}

Beachten Sie, dass diese Bibliothek nur für reguläre Ausdrücke funktioniert, die eine reguläre Sprache beschreiben: Sie unterstützt einige erweiterte Funktionen, wie z. B. Rückverweise, nicht.

1345680cookie-checkBibliothek, um zu prüfen, ob zwei reguläre Ausdrücke gleich/isomorph sind [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy