Comment générer au hasard des chaînes qui correspondent à une expression régulière?
Double:
Chaîne de caractères aléatoires qui correspond à une expression régulière
Non, il n'est pas. Je suis à la recherche d'un moyen facile et universelle de la méthode, celle que j'ai pu le mettre en œuvre. C'est beaucoup plus difficile que génère aléatoirement des mots de passe.
Je veux créer une application qui prend une expression régulière, et montre 10 généré de façon aléatoire chaînes qui correspondent à l'expression. Il est censé aider les gens à mieux comprendre leurs expressions régulières, et de décider à savoir si elles sont suffisamment sécurisé pour des fins de validation. Quelqu'un sait-il d'un moyen facile de le faire?
Une solution évidente serait d'écrire (ou voler) une regexp parser, mais qui semble vraiment au dessus de ma tête.
Je le répète, je suis à la recherche d'un facile et universelle façon de le faire.
Edit: approche par force Brute est hors de question. En supposant que les chaînes aléatoires serait juste [a-z0-9]{10}
et 1 million d'itérations par seconde, il faudrait 65 ans pour itérer la traversée de l'espace de tous les 10 caractères les chaînes de caractères.
- Je ne pense pas qu'il va y avoir un moyen facile de le faire... peut-être le mechanical turk? 🙂
- Avez-vous un particulier regex dans l'esprit, ou êtes-vous après une solution générale pour toutes les regex variante? Parce que vous n'allez pas en trouver un qui fonctionne pour Perl ainsi que .NET, sauf si vous vous limitez à vraiment des expressions régulières sans aucune extension.
- Eh bien, je voudrais une solution générale pour une seule variante, notamment celui que j'utilise, les Expressions Régulières de Perl implémentation en PHP.
- En général, le problème est #P-dur. researchgate.net/publication/...
- Voir aussi étant Donné une expression régulière, comment pourrais-je générer toutes les chaînes qui correspondent à elle?
Vous devez vous connecter pour publier un commentaire.
Analyser votre expression régulière dans une DFA, puis traverser votre DFA au hasard jusqu'à ce que vous vous retrouvez dans un état acceptant, la sortie d'un personnage pour chaque transition. Chaque promenade se donner une nouvelle chaîne qui correspond à l'expression.
Cela ne fonctionne pas "régulière" des expressions qui ne sont pas très réguliers, tels que les expressions avec des références arrières. Ça dépend de quel genre d'expression que vous êtes après.
Prendre un coup d'oeil à Perl String::Aléatoire.
Plutôt laid solution qui peut ou peut ne pas être pratique est de tirer parti de l'existant regex option diagnostics. Certains regex bibliothèques ont la capacité de comprendre d'où l'expression régulière n'ont pas pu égaler. Dans ce cas, vous pourrait utiliser ce qui est en effet une forme de force brute, mais en utilisant les caractères un à un et essayer d'obtenir plus de temps (et de loin-matching) des chaînes jusqu'à ce que vous avez obtenu un plein match. C'est une très laid solution. Cependant, contrairement à une norme de la force brute de la solution, il l'échec sur la chaîne ab sera aussi vous dire qu'il existe une chaîne ab.* qui va correspondre (si non, arrêtez-vous et essayez ac. Si oui, essayez une plus longue chaîne). Ce n'est probablement pas faisable avec tous les regex bibliothèques.
Sur le côté positif, ce type de solution est probablement assez cool à partir d'un point de vue enseignement. Dans la pratique, c'est probablement des effets semblables à un dfa solution, mais sans la nécessité de penser à propos de dfas.
Notez que vous ne voulez pas utiliser des chaînes aléatoires avec cette technique. Toutefois, vous pouvez utiliser des caractères aléatoires pour commencer, si vous gardez une trace de ce que vous avez testé dans un arbre, de sorte que l'effet est le même.
si votre seul critère est que votre méthode est simple et universel, alors il n'y a rien de plus facile ni de plus universel que la force brute. 🙂
De sûr, c'est un très stupide façon de faire les choses et surtout a été conçu comme une blague.
Je pense que votre meilleur pari serait d'essayer d'écrire votre propre très de base de l'analyseur, l'enseignement, il juste les choses que vous vous attendez à rencontrer (par exemple: la lettre et le nombre de plages, en répétant d'option et/ou des personnages... ne vous inquiétez pas à propos de look-derrières etc)
L'universalité critère est impossible. Compte tenu de l'expression régulière "^Pour être ou ne pas être, telle est la question:$", il n'y aura pas dix aléatoire unique chaînes qui correspondent.
Pour les non-dégénérée cas:
moonshadow lien en Perl String::le Hasard est la réponse. Un programme en Perl qui lit un RegEx partir de l'entrée standard et écrit la sortie de dix invocations de String::Aléatoire à la sortie standard (stdout) est trivial. Compiler pour Windows ou Unix exe avec Perl2exe et à l'appeler à partir de PHP, Python, ou quoi que ce soit.
Voir aussi Générateur de Texte aléatoire basé sur les regex