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 ).Antworten:
Die grundlegenden Theoreme der formalen Sprachtheorie sind, dass reguläre Ausdrücke, reguläre Grammatiken, deterministische endliche Automaten (DFAs) und nichtdeterministische endliche Automaten (NFAs) alle die gleichen Arten von Sprachen beschreiben: nämlich die regulären Sprachen. Die Tatsache, dass wir diese Sprachen auf so viele völlig unterschiedliche Arten beschreiben können, legt nahe, dass diese Sprachen etwas Natürliches und Wichtiges haben, genauso wie die Äquivalenz von Turing-Maschinen, der Lambda-Rechnung und allen möglichen anderen Dingen darauf hindeutet, dass die berechenbaren Sprachen sind natürlich und wichtig. Sie sind nicht nur ein Artefakt der zufälligen Entscheidungen, die der ursprüngliche Entdecker getroffen hat.
Also, um die Titelfrage zu beantworten, reguläre Ausdrücke können nicht Permutationen tun , und wir fügen diese Fähigkeit nicht , denn dann würden reguläre Ausdrücke nicht reguläre Sprachen entsprechen. Allerdings ist es möglich, dass "reguläre Ausdrücke mit Permutationen" auch eine interessante Klasse von Sprachen mit vielen verschiedenen Charakterisierungen sind.
quelle
!
Operator in der Praxis nie gebraucht, und ich nehme an, dass nur wenige Leute dies getan haben, da es einfach zu implementieren ist und keine Implementierung von erweiterten regulären Ausdrücken I ' habe gesehen unterstützt es.Ihr "Beweis" befasste sich nur mit Permutationen einzelner Wörter, die endliche Sprachen sind.
Jede endliche Sprache ist regulär (z. B. nur durch Auflisten aller Mitglieder mit einem
|
dazwischen liegenden), aber es gibt unendlich viele reguläre Sprachen (und diese sind im Allgemeinen die interessanteren).Sobald Sie einen regulären Ausdruck (oder eine Grammatik / einen Automaten) erhalten, der eine unendliche Sprache akzeptiert (dh einen Ausdruck mit dem
*
Operator oder einen Automaten mit einer Schleife), funktioniert Ihre Konstruktion nicht mehr (Sie erhalten eine unendliche Grammatik / einen unendlichen Automaten) ).Die Antwort von David Richerby lieferte ein Beispiel für eine reguläre Sprache, deren Permutationssprache nicht mehr regulär ist - alle diese Beispiele sind unendliche Sprachen.
quelle
In gewissem Sinne gibt es keine prägnante Möglichkeit, alle Permutationen eines Wortes anzugeben.
quelle
Warum es keine Möglichkeit gibt, "Permutation von" in Regexes zu schreiben
Eine Permutation einer regulären, unendlichen Sprache (unendlich viele Wörter) ist nicht unbedingt regelmäßig. Daher kann es nicht als Regex geschrieben werden.
Beweis
Denken Sie an die Sprache
(ab)*
. (Beispiel inspiriert von David Richerby .) Eine seiner Permutationen ista*b*
. Dies ist keine reguläre Sprache. qed.quelle