Chaîne de caractères aléatoires qui correspond à une expression régulière
Comment vous allez sur la création aléatoire d'une chaîne alphanumérique qui correspond à une certaine expression régulière?
C'est spécifiquement pour la création de mots de passe initiaux qui s'acquitter régulièrement de mot de passe.
Vous devez vous connecter pour publier un commentaire.
Welp, juste à la rêverie, mais la question générale de la génération aléatoire d'entrées qui correspondent à une expression régulière de sons faisable pour moi pour une relaxation définition de l'aléatoire et suffisamment serré définition de l'expression rationnelle. Je pense à la classique définition formelle, qui ne permet qu' ()|* et les lettres de l'alphabet.
Les expressions régulières peuvent être mappés aux officiels de machines appelées automates finis. Une telle machine est un graphe orienté avec un nœud particulier appelé l'état final, un nœud appelé l'état initial, et une lettre de l'alphabet sur chaque bord. Un mot est accepté par la regex si il est possible de commencer à l'état initial et de traverser une arête étiquetée avec chaque personnage à travers le graphe et la fin à l'état final.
On pouvait construire le graphe, puis commencer à l'état final et de traverser aléatoire bords vers l'arrière, en gardant la trace de la trajectoire. Dans une construction standard, chaque nœud du graphe est accessible à partir de l'état initial, de sorte que vous n'avez pas besoin de vous soucier de faire des erreurs irrécupérables et avoir à revenir en arrière. Si vous atteignez l'état initial, d'arrêter et de lire le chemin de l'avenir. C'est votre match pour la regex.
Il n'y a aucune garantie particulière sur quand ou si vous arrivez à l'état initial, si. On aurait pu comprendre en quel sens l'généré chaînes sont "aléatoires", et en ce sens vous êtes l'espoir pour un élément au hasard dans la langue en premier lieu.
C'est peut-être un point de départ pour penser le problème, si!
Maintenant que j'ai écrit ça, il me semble qu'il pourrait être plus simple à plusieurs reprises de résoudre des choix afin de simplifier l'expression régulière pattern jusqu'à ce que vous êtes de gauche avec une simple chaîne de caractères. Trouver le premier non-alphabet caractère dans le modèle. Si c'est un *, reproduire l'élément précédent certain nombre de fois et de supprimer le *. Si c'est un |, choisir l'un OU l'avais éléments à conserver et supprimer le reste. Pour une parenthèse gauche, faire la même chose, mais en regardant le caractère à la suite de la correspondance de droit parenthèse. C'est probablement plus facile si vous analysez les regex dans une représentation arborescente d'abord qui fait la parenthèse groupement structure plus facile de travailler avec.
À la personne qui a peur que de décider si une expression régulière correspond en fait à tout ce qui est équivalent au problème de l'arrêt: Non, les langages réguliers sont très bien comportés. Vous pouvez dire si les deux regexes décrire le même ensemble de accepté de chaînes. En gros, vous avez de la machine ci-dessus, puis suivre un algorithme pour produire une représentation canonique minimale équivalent de la machine. Le faire pour deux regexes, puis vérifiez si le minimum machines sont équivalentes, ce qui est logique.
String::Aléatoire en Perl va générer une chaîne de caractères aléatoires à partir d'un sous-ensemble d'expressions régulières:
Si vous avez un problème spécifique, vous avez probablement un spécifique de l'expression régulière à l'esprit. Je voudrais prendre cette expression régulière, travailler sur ce que cela signifie en termes humains simples, et de travailler à partir de là.
Je soupçonne que c'est possible à la création d'un regex correspondance aléatoire générateur, mais il est susceptible d'être beaucoup plus de travail que de simplement la manipulation d'un cas précis - même si ce cas de changements que quelques fois par an.
(En fait, il peut ne pas être possible de générer au hasard des correspondances dans le sens le plus général - j'ai un vague souvenir que le problème de "n'importe quelle chaîne de caractères correspondant à cette expression rationnelle" est le problème de l'arrêt dans le déguisement. Avec un très coupe-bas de la regex de la langue vous pouvez avoir plus de chance cependant.)
(?=a)(?!a)
? :pJ'ai écrit Persil, qui se composent d'un analyseur lexical et d'un Générateur.
L'exemple ci-dessus va générer un tableau contenant 100 codes, chaque préfixé par "FOO", suivi de 10 caractères à partir de "ABCDEFGHKMNOPRSTUVWXYZ23456789" botte de foin et 2 numéros de "0123456789" botte de foin.
Cette bibliothèque PHP a l'air prometteur: ReverseRegex
Comme tous ces, il s'occupe seulement un sous-ensemble d'expressions régulières, mais il peut faire assez complexe trucs comme le royaume-UNI code postal:
Sorties
Vous auriez besoin d'écrire une chaîne de caractères générateur capable d'analyser les expressions régulières et de générer au hasard des membres de caractère gammes de longueurs irrégulières, etc.
Beaucoup plus facile serait d'écrire un mot de passe aléatoire générateur de certaines règles (qui commence par une lettre minuscule, au moins un des signes de ponctuation, capitale des lettres et des chiffres, au moins 6 caractères, etc) et puis les écrire votre regex, de sorte que tous les mots de passe créés avec lesdites règles sont valables.
En supposant que vous avez un minimum de longueur et 3 de 4* (ou similaire), j'aimerais juste être enclins à utiliser un décent générateur de mot de passe.
J'ai construit un couple dans le passé (à la fois basées sur le web et ligne de commande), et n'ont jamais eu à sauter plus d'une chaîne générée par passer la 3 de 4 la règle.
Il est possible (par exemple, Haskell regexp module a une suite de tests qui génère automatiquement des chaînes de caractères qui doit correspondre à certains regexes).
Cependant, pour une simple tâche à portée de main, vous pourriez être mieux de prendre un simple générateur de mot de passe et le filtrage de sa sortie avec la regexp.
Utiliser la accepté de répondre à Générer Des Mots De Passe Aléatoires jusqu'à ce qu'il corresponde à votre regexp.
Pourquoi ne pas travailler les regexp en arrière? Un exemple simple: si votre regexp est
alors vous savez que vous avez besoin de 6 lettres a-z ou a-Z, afin de les générer. Cela peut être un amateur, bien sûr, et en fonction de vos besoins, vous pouvez vous retrouver inverse de l'écriture d'un ensemble de regexp parser, mais vous pouvez arrêter l'ajout de fonctionnalités lorsque vous avez rempli votre besoin.