Wie generieren Sie zufällige Zeichenfolgen entsprechen einem bestimmten regexp?
Duplizieren:
Nein, ist es nicht. Ich bin auf der Suche für eine einfache und Universelle Methode, eine, die konnte ich tatsächlich umsetzen. Das ist viel schwieriger, als nach dem Zufallsprinzip Passwörter generieren.
Möchte ich eine Anwendung erstellen, nimmt einen regulären Ausdruck, und zeigt 10 zufällig generierten Zeichenfolgen, die match-Ausdruck. Es soll den Menschen helfen, besser zu verstehen, Ihre regexps, und zu entscheiden, d.h., ob Sie sicher genug für die Validierung. Kennt jemand eine einfache Möglichkeit das zu tun?
Eine offensichtliche Lösung wäre, zu schreiben (oder stehlen) Sie einen regexp-parser, aber das scheint wirklich über meinen Kopf.
Ich wiederhole, ich bin auf der Suche nach einem einfache und Universelle Weg, das zu tun.
Edit: Brute-force-Ansatz ist aus der Frage. Vorausgesetzt, die zufällige Zeichenfolgen nur [a-z0-9]{10}
und 1 Millionen Iterationen pro Sekunde, die es dauern würde, 65 Jahre zum Durchlaufen durch den Raum alle 10-char-strings.
- Ich glaube nicht, dass es eine einfache Möglichkeit, dies zu tun... vielleicht ist das mechanical turk? 🙂
- Hast du einen bestimmten regex im Sinn, oder sind Sie nach einer Allgemeinen Lösung für alle regex-Variante? Weil du nicht gehst, einen zu finden, der arbeitet für Perl als auch .NET, es sei denn, Sie beschränken Sie sich auf wirklich reguläre Ausdrücke ohne jegliche Erweiterungen.
- Gut, ich möchte eine Allgemeine Lösung für eine einzige Variante, vor allem die, die ich verwenden, Reguläre Perl-Ausdrücke Umsetzung in PHP.
- Im Allgemeinen, das problem ist #P-hart. researchgate.net/publication/...
- Siehe auch Gegeben ein regulärer Ausdruck ist, wie kann ich das generieren von Zeichenfolgen, die passen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Analysieren des regulären Ausdrucks in ein DFA, dann durchqueren Sie den DFA zufällig, bis Sie am Ende in einem akzeptierenden Zustand, Ausgabe von Zeichen für jeden übergang. Jeder Spaziergang wird der Ertrag einem neuen string, der auf den Ausdruck passt.
Dies funktioniert nicht für "normale" Ausdrücke, die nicht wirklich regelmäßig, wenn auch, wie Ausdrücke mit Rückverweise. Es hängt davon ab, welche Art von Ausdruck Sie sind nach.
Werfen Sie einen Blick auf Perl -String::Random.
Eine eher hässliche Lösung, die möglicherweise oder möglicherweise nicht praktisch sein, ist die Nutzung einer vorhandenen regex-Diagnose-option. Einige regex-Bibliotheken haben die Möglichkeit, herauszufinden, wo die regex fehlgeschlagen zu entsprechen. In diesem Fall, Sie könnte Verwendung was ist in der Tat eine form von brute-force, aber mit einem Zeichen zu einem Zeitpunkt und zu versuchen, länger (weiter-matching) Saiten, bis Sie bekommen eine vollständige übereinstimmung. Dies ist eine sehr hässliche Lösung. Jedoch, im Gegensatz zu einem standard-brute-force-Lösung, it-Ausfalls auf einer Schnur ab, wird Ihnen auch sagen, ob es eine Zeichenkette ab.* die passt (wenn nicht, stoppen und versuchen Sie es Wechselstrom. Wenn ja, versuchen Sie eine längere Zeichenfolge). Dies ist wahrscheinlich nicht machbar, mit allen regex-Bibliotheken.
Auf der hellen Seite, diese Art von Lösung ist wahrscheinlich ziemlich cool, aus einem Lehr-Perspektive. In der Praxis ist es wohl ähnlich in der Wirkung zu einem dfa-Lösung, aber ohne die Notwendigkeit, zu denken, dfas.
Beachten Sie, dass Sie nicht wollen, um zufällige Zeichenfolgen mit dieser Technik. Allerdings können Sie mit zufälligen Zeichen zu beginnen, wenn Sie verfolgen, was Sie getestet haben, in einem Baum, so dass der Effekt ist der gleiche.
wenn Ihre einzige Kriterien sind, dass Ihre Methode ist einfach und universal, dann es ist nicht nichts, einfacher und universeller als brute-force. 🙂
Natürlich, das ist eine sehr dumme Art und Weise, Dinge zu tun und meist als Witz gemeint war.
Ich denke, Ihre beste Wette wäre, zu versuchen schreiben Sie Ihre eigenen sehr einfachen parser, Lehre es gerade die Dinge, die Sie erwarten, zu begegnen (z.B.: Buchstaben-und Zahlenkombination reicht, wiederholen/optionale Zeichen... Mach dir keine sorgen über look-behinds etc)
Kriterium der Universalität ist unmöglich. Gegeben ist der reguläre Ausdruck "^Zu sein, oder nicht sein-das ist die Frage,:$", wird es keine zehn einzigartige random-strings entsprechen.
Für nicht-Entartete Fälle:
moonshadow link zum Perl-String::Random, ist die Antwort. Ein Perl-Programm, das liest ein RegEx von der Standardeingabe und schreibt das Ergebnis von zehn Aufrufe von String::Random stdout ist trivial. Kompilieren Sie es, um entweder eine Windows-oder Unix-exe-Datei mit Perl2exe und es aufrufen, aus PHP, Python, oder was auch immer.
Siehe auch Random Text generator basierend auf regex