132 votes

Utilisation de Regex pour générer des chaînes de caractères plutôt que de les faire correspondre

J'écris un utilitaire Java qui m'aide à générer des charges de données pour des tests de performance. Il s'agit de realmente J'aimerais pouvoir spécifier une expression rationnelle pour les chaînes de caractères afin que mon générateur génère des éléments qui y correspondent. Existe-t-il quelque chose de déjà conçu que je puisse utiliser pour faire cela ? Ou existe-t-il une bibliothèque qui me permette d'y arriver ?

Merci

1 votes

Voici un outil utile bibliothèque java qui fournit de nombreuses fonctionnalités pour l'utilisation de regex pour générer des chaînes (génération aléatoire, générer des chaînes basées sur leur index, générer toutes les chaînes ). aquí

0 votes

Une autre solution pourrait être este

57voto

Cheekysoft Points 16532

Editar:

Liste complète des bibliothèques suggérées sur cette question :

  1. Xeger * - Java
  2. Generex * - Java
  3. Rgxgen - Java
  4. rxrdg - C#

* - Dépend de dk.brics.automaton

Editar: 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 original :

Tout d'abord, avec une regexp suffisamment complexe, je pense que cela peut être impossible. Mais vous devriez être capable d'assembler quelque chose pour des regexp simples.

Si vous jetez un œil au code source de la classe java.util.regex.Pattern, vous verrez qu'elle utilise une représentation interne des instances Node. Chacun des différents composants du motif possède sa propre implémentation d'une sous-classe de Node. Ces Nodes sont organisés en arbre.

En produisant un visiteur qui traverse cet arbre, vous devriez être en mesure d'appeler une méthode de générateur surchargée ou une sorte de Builder qui bricole quelque chose.

2 votes

Je ne suis pas sûr que Xeger soit si bon. Il ne peut pas gérer les classes de caractères. Il ne parvient pas à reconnaître un simple [\w] . Un regard sur la dernière ligne de leur wiki nous dit que.

2 votes

Notez également que ceux-ci dépendent de dk.brics.automaton donc soyez prêt à ajouter des dépendances pom de tierce partie. La plupart des gens n'y voient pas d'inconvénient, mais j'aurais aimé qu'il y ait quelque chose d'un peu plus compact.

0 votes

Il existe une alternative pour xeger et generex. Elle ne présente pas tous ces inconvénients et n'est pas obsolète. Veuillez faire défiler la page jusqu'à ma réponse.

25voto

Mifmif Points 1081

Il est trop tard pour aider le posteur initial, mais cela pourrait aider un nouveau venu. Generex est une bibliothèque java utile qui fournit de nombreuses fonctionnalités pour utiliser les regex afin de générer des chaînes de caractères (génération aléatoire, génération d'une chaîne de caractères basée sur son index, génération de toutes les chaînes de caractères...).

Ejemplo :

Generex generex = new Generex("[0-3]([a-c]|[e-g]{1,2})");

// generate the second String in lexicographical order that matches the given Regex.
String secondString = generex.getMatchedString(2);
System.out.println(secondString);// it print '0b'

// Generate all String that matches the given Regex.
List<String> matchedStrs = generex.getAllMatchedStrings();

// Using Generex iterator
Iterator iterator = generex.iterator();
while (iterator.hasNext()) {
    System.out.print(iterator.next() + " ");
}
// it prints 0a 0b 0c 0e 0ee 0e 0e 0f 0fe 0f 0f 0g 0ge 0g 0g 1a 1b 1c 1e
// 1ee 1e 1e 1f 1fe 1f 1f 1g 1ge 1g 1g 2a 2b 2c 2e 2ee 2e 2e 2f 2fe 2f 2f 2g
// 2ge 2g 2g 3a 3b 3c 3e 3ee 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 3g 1ee

// Generate random String
String randomStr = generex.random();
System.out.println(randomStr);// a random value from the previous String list

Divulgation

Le projet mentionné sur ce post appartient à l'utilisateur qui répond (Mifmif) à la question. Conformément à la reglas il faut en parler.

12 votes

On dirait que Generex est votre propre projet. Pourriez-vous mentionner dans votre message qu'il s'agit de votre propre projet, conformément aux règles aquí ?

21voto

Wilfred Springer Points 5430

Xeger (Java) est également capable de le faire :

String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);

2 votes

Xeger fonctionne bien. MAIS assurez-vous que vous avez le bocal d'automate sur le chemin de la classe ou dans votre pom/gradle

5voto

samjudson Points 27483

Visual Studio Team System inclut quelque chose comme ceci http://msdn.microsoft.com/en-us/library/aa833197(VS.80).aspx

Je ne suis pas d'une grande aide pour Java, je suis désolé.

4voto

Craig Points 1013

Sur le podcast 11 de stackoverflow :

Spolsky : Yep. Il y a aussi un nouveau produit, si vous ne voulez pas utiliser le Team System, nos amis de Redgate ont un produit appelé SQL Data Generator [ [http://www.red-gate.com/products/sql\_data\_generator/index.htm\]](http://www.red-gate.com/products/sql_data_generator/index.htm]) . C'est 295 $, et il génère juste des données de test réalistes. Il fait des choses comme générer de vraies villes dans la colonne des villes qui existent réellement, et quand il les génère, il obtient l'état correct, au lieu de se tromper, ou de mettre des états dans des villes allemandes et des choses comme... vous savez, il génère des données assez réalistes. Je ne suis pas vraiment sûr de toutes les fonctionnalités.

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 n'ai rien trouvé dans google, donc je suggère d'aborder le problème en analysant une expression régulière donnée dans les plus petites unités de travail ( \w , [x-x], \d ) et écrire quelques méthodes de base pour prendre en charge ces expressions régulières.

Donc pour \w vous auriez une méthode getRandomLetter() qui renvoie une lettre aléatoire quelconque, et vous auriez également getRandomLetter(char startLetter, char endLetter) qui vous donne une lettre aléatoire entre les deux valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X