Das Problem
Es gibt keine einfache Möglichkeit, eine Permutation mit einem regulären Ausdruck zu erhalten.
- Permutation: Ein Wort ("aabc") in eine andere Reihenfolge bringen, ohne die Anzahl oder Art der Buchstaben zu ändern.
- Regex: Regulärer Ausdruck.
Zur Überprüfung:
- "Regex-Permutationen ohne Wiederholung" Die Antwort erstellt JavaScript-Code anstelle eines Regex, vorausgesetzt, dies wäre einfacher.
- "So finden Sie alle Permutationen eines bestimmten Wortes in einem bestimmten Text" - In der Antwort werden auch keine regulären Ausdrücke verwendet.
- "Regex für alle {1, 2, 3, 4} ohne Wiederholung" - Die Antwort verwendet Regexe, ist jedoch weder anpassbar noch einfach.
- Diese Antwort behauptet sogar: "Ein regulärer Ausdruck kann nicht das tun, wonach Sie fragen. Er kann keine Permutationen aus einer Zeichenfolge generieren . "
Die Art von Lösung, nach der ich suche
Es sollte die Form haben:
- »Aabc« (oder irgendetwas anderes, das Sie in Klammern öffnen und schließen könnten)
- (aabc)! (ähnlich wie (abc)? aber mit einem anderen Symbol am Ende)
- [aabc]! (ähnlich wie [abc] +, jedoch mit einem anderen Symbol am Ende)
Vorteile dieser Lösungen
Sie sind:
- einfach
- anpassungsfähig
- wiederverwendbar
Warum sollte das existieren
- Regexe sind eine Möglichkeit, eine Grammatik einer regulären Sprache zu beschreiben. Sie haben die volle Macht, jede Art von regulärer Sprache zu sein.
- Nehmen wir an, reguläre Sprachen sind leistungsfähig genug für Permutationen (Beweis unten) - warum gibt es keine einfache Möglichkeit, dies auszudrücken?
Meine Frage lautet also:
- (Warum) Ist mein Beweis falsch?
- Wenn es richtig ist: Warum gibt es keine einfache Möglichkeit, Permutationen auszudrücken?
Der Beweis
- Reguläre Ausdrücke sind eine Möglichkeit, die Grammatik einer regulären Sprache zu notieren. Sie können jede reguläre Sprachgrammatik beschreiben.
- Eine andere Möglichkeit, reguläre Sprachen (deren Alphabet eine endliche Anzahl von Buchstaben enthält) zu beschreiben, sind nicht deterministische Automaten (mit einer endlichen Anzahl von Zuständen).
Mit einer endlichen Anzahl von Buchstaben kann ich diesen Automaten erstellen: (Beispiel. Formal: siehe unten)
Grammatik, die Permutationen von "abbc" akzeptiert:
(sry für Zahlen oben, vielleicht weiß jemand, wie man diesen Teil besser aussehen lässt)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (kein Tippfehler! Äquivalenz)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h² -> bb
h²² -> ac
h²² -> ca.
h²³ -> ab
h²³ -> ba
Formaler: (mit einem Finite-State-Automaten, aber dies könnte auch mit Grammatik gemacht werden)
- Ein Wort q (mit endlicher Länge), zu dem jede Permutation einen akzeptierenden Zustand erreichen soll.
- X ist das endliche Alphabet.
- Die Menge der Zustände S enthält eine beliebige Reihenfolge von Buchstaben bis zur Länge von q. (Die Größe von S ist also endlich.) Plus ein Zustand "jedes längere Wortes".
- Zustandsübergangsfunktion d, die einen Buchstaben nimmt und sich auf den Zustand bewegt, der dem jetzt gelesenen Teil des Wortes entspricht.
- F ist eine Menge dieser Zustände, die exakte Permutationen von q sind.
So ist es möglich, einen endlichen Automaten zum Akzeptieren von Permutationen eines gegebenen Wortes zu erstellen.
Fahren Sie mit dem Beweis fort
Ich habe also bewiesen, dass reguläre Sprachen die Möglichkeit haben, nach Permutationen zu suchen, oder?
Warum gibt es keinen Ansatz, um dies mit Regexes zu erreichen? Es ist eine nützliche Funktionalität.
^(a()|a()|b()|c()){4}\2\3\4\5$
scheint zu funktionieren (siehe regex101.com/r/9URPpg/4/tests ).