J'écris un utilitaire Java qui m'aide à générer des tonnes de données pour les tests de performances. Ce serait vraiment cool de pouvoir spécifier une regex pour Strings afin que mon générateur crache des choses qui correspondent à cela. Y a-t-il quelque chose de déjà cuit que je peux utiliser pour le faire? Ou y a-t-il une bibliothèque qui m'accompagne la plupart du temps?
Merci
Réponses:
Edit: Comme mentionné dans les commentaires, il existe une bibliothèque disponible sur Google Code pour y parvenir: https://code.google.com/archive/p/xeger/
Voir aussi https://github.com/mifmif/Generex comme suggéré par Mifmif
Message d'origine:
Premièrement, avec une expression rationnelle suffisamment complexe, je pense que cela peut être impossible. Mais vous devriez pouvoir créer quelque chose pour des expressions rationnelles simples.
Si vous regardez le code source de la classe java.util.regex.Pattern, vous verrez qu'elle utilise une représentation interne des instances de Node. Chacun des différents composants de modèle a sa propre implémentation d'une sous-classe Node. Ces nœuds sont organisés dans un arbre.
En produisant un visiteur qui parcourt cet arbre, vous devriez pouvoir appeler une méthode de générateur surchargée ou une sorte de Builder qui concocte quelque chose ensemble.
la source
[\w]
. Un regard sur la dernière ligne de leur wiki nous le dit.dk.brics.automaton
donc soyez prêt à ajouter des dépendances pom tierces. La plupart des gens ne s'en soucient pas, mais j'aimerais qu'il y ait quelque chose d'un peu plus compact.Il est trop tard pour aider l'affiche originale, mais cela pourrait aider un nouveau venu. Generex est une bibliothèque java utile qui fournit de nombreuses fonctionnalités pour utiliser des expressions rationnelles pour générer des chaînes (génération aléatoire, génération d'une chaîne basée sur son index, génération de toutes les chaînes ...).
Exemple :
Divulgation
Le projet mentionné sur ce post appartient à l'utilisateur répondant (Mifmif) à la question. Conformément aux règles , cela doit être évoqué.
la source
Xeger (Java) est également capable de le faire:
la source
J'ai commencé à rouler moi- même bibliothèque pour cela (en c # mais devrait être facile à comprendre pour un développeur Java).
Rxrdg a commencé comme une solution à un problème de création de données de test pour un projet réel. L'idée de base est de tirer parti des modèles de validation existants (expression régulière) pour créer des données aléatoires conformes à ces modèles. De cette façon, des données aléatoires valides sont créées.
Il n'est pas si difficile d'écrire un analyseur pour des modèles de regex simples. L'utilisation d'un arbre de syntaxe abstraite pour générer des chaînes devrait être encore plus simple.
la source
Sur le podcast stackoverflow 11:
Ce n'est probablement pas ce que vous recherchez, mais cela pourrait être un bon point de départ, au lieu de créer le vôtre.
Je ne semble pas trouver quoi que ce soit dans google, donc je suggérerais de résoudre le problème en analysant une expression régulière donnée dans les plus petites unités de travail (\ w, [xx], \ d, etc.) et en écrivant quelques méthodes de base pour prendre en charge ces expressions d'expressions régulières.
Donc pour \ w vous auriez une méthode getRandomLetter () qui renvoie n'importe quelle lettre aléatoire, et vous auriez également getRandomLetter (char startLetter, char endLetter) qui vous donne une lettre aléatoire entre les deux valeurs.
la source
Cette question est vraiment ancienne, même si le problème était réel pour moi. J'ai essayé xeger et Generex et ils ne semblent pas répondre à mes exigences. En fait, ils ne parviennent pas à traiter certains des modèles de regex (comme
a{60000}
) ou pour d'autres (par exemple(A|B|C|D|E|F)
), ils ne produisent tout simplement pas toutes les valeurs possibles. Comme je n'ai trouvé aucune autre solution appropriée, j'ai créé ma propre bibliothèque.https://github.com/curious-odd-man/RgxGen
Il y a aussi un artefact sur maven central disponible.
Exemple d'utilisation:
la source
Je sais qu'il y a déjà une réponse acceptée, mais j'ai utilisé le générateur de données de RedGate (celui mentionné dans la réponse de Craig) et cela fonctionne VRAIMENT bien pour tout ce que j'ai lancé. C'est rapide et cela me laisse envie d'utiliser la même expression régulière pour générer les données réelles pour des choses comme les codes d'enregistrement que cette chose crache.
Il faut une expression régulière comme:
et il génère des tonnes de codes uniques comme:
Est-ce un gros algorithme secret que RedGate a découvert et que nous n'avons tous pas de chance ou est-ce quelque chose que nous, simples mortels, pourrions faire?
la source
Je suis en vol et je viens de voir la question: j'ai écrit la solution la plus simple mais inefficace et incomplète. J'espère que cela vous aidera à commencer à écrire votre propre analyseur:
la source
Vous devrez écrire votre propre analyseur, comme l'a fait l'auteur de String :: Random (Perl). En fait, il n'utilise les expressions régulières nulle part dans ce module, c'est juste ce à quoi les codeurs perl sont habitués.
D'un autre côté, vous pouvez peut-être jeter un coup d'œil à la source , pour obtenir des indications.
EDIT: Merde, blair m'a battu au coup de poing de 15 secondes.
la source
Il est loin de supporter une expression régulière PCRE complète, mais j'ai écrit la méthode Ruby suivante pour prendre une chaîne de type regexp et en produire une variation. (Pour CAPTCHA basé sur la langue.)
la source
Cette question est très ancienne, mais je suis tombée dessus lors de ma propre recherche, je vais donc inclure quelques liens pour d'autres personnes qui pourraient rechercher la même fonctionnalité dans d'autres langues.
la source
Si vous souhaitez générer des chaînes "critiques", vous pouvez envisager:
EGRET http://elarson.pythonanywhere.com/ qui génère des chaînes "diaboliques" couvrant vos expressions régulières
MUTREX http://cs.unibg.it/mutrex/ qui génère des chaînes de détection de pannes par mutation regex
Les deux sont des outils académiques (je suis l'un des auteurs de ce dernier) et fonctionnent raisonnablement bien.
la source