Comment puis-je générer du texte correspondant à une expression régulière d'une expression régulière? [fermé]

StackOverflow https://stackoverflow.com/questions/1578789

Question

Eh oui, vous avez bien lu. Je besoin de quelque chose qui est capable de générer texte aléatoire à partir d'une expression régulière. Ainsi, le texte doit être aléatoire, mais aller de pair avec l'expression régulière. Il semble qu'il n'existe pas, mais je peux me tromper.

Juste un exemple: cette bibliothèque serait capable de prendre « [ab]*c » en entrée, et générer des échantillons tels que:

  

abc
  abbbc
  bac

etc.

Mise à jour: J'ai créé moi-même quelque chose: Xeger. Consultez http://code.google.com/p/xeger/ .

Était-ce utile?

La solution

Je viens de créer une bibliothèque pour faire cela il y a une minute. Il est hébergé ici: http://code.google.com/p/xeger/ . Lisez attentivement les instructions avant de l'utiliser. (En particulier celle qui se rapporte à télécharger une autre bibliothèque nécessaire.); -)

Ceci est la façon dont vous utilisez:

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

Autres conseils

Je ne suis pas au courant d'une telle bibliothèque. Si vous êtes intéressé par écrit un vous-même, ce sont probablement les étapes que vous devrez prendre:

  1. Ecrire un analyseur pour les expressions régulières (vous pouvez commencer avec une classe restreinte de regexes).

  2. : utiliser le résultat de la construction d'un .

  3. (Facultatif) Convertir la NFA à un de de.

  4. traversent de façon aléatoire l'automate résultant de l'état de démarrage à un état d'accepter, tout en stockant les caractères délivrées par chaque transition.

Le résultat est un mot qui est accepté par le regex d'origine. Pour plus, voir par exemple Conversion d'une expression régulière dans un déterministes Automaton Finite .

est ici quelques implémentations d'une telle bête, mais aucun d'entre eux en Java (et tout, mais la source fermée Microsoft très limitée dans leur soutien à la fonction regexp).

basé sur la solution de Wilfred Springer avec http://www.brics.dk/~amoeller/automaton/ i construire un autre générateur . Il ne pas utiliser la récursivité. Il prend en entrée le boniment / regularExpression longueur minimale de chaîne et de la longueur maximale de la chaîne. Le résultat est une chaîne acceptée entre min et durée max. Il permet également certains des XML « classes de caractères sténographie ». J'utilise cela pour un XML générateur d'échantillons qui construisent chaîne valide pour les facettes.

public static final String generate(final String pattern, final int minLength, final int maxLength) {
    final String regex = pattern
            .replace("\\d", "[0-9]")        // Used d=Digit
            .replace("\\w", "[A-Za-z0-9_]") // Used d=Word
            .replace("\\s", "[ \t\r\n]");   // Used s="White"Space
    final Automaton automaton = new RegExp(regex).toAutomaton();
    final Random random = new Random(System.nanoTime());
    final List<String> validLength = new LinkedList<>();
    int len = 0;
    final StringBuilder builder = new StringBuilder();
    State state = automaton.getInitialState();
    Transition[] transitions;
    while(len <= maxLength && (transitions = state.getSortedTransitionArray(true)).length != 0) {
        final int option = random.nextInt(transitions.length);
        if (state.isAccept() && len >= minLength && len <= maxLength) validLength.add(builder.toString());
        final Transition t = transitions[option]; // random transition
        builder.append((char) (t.getMin()+random.nextInt(t.getMax()-t.getMin()+1))); len ++;
        state = t.getDest();
    }
    if(validLength.size() == 0) throw new IllegalArgumentException(automaton.toString()+" , "+minLength+" , "+maxLength);
    return validLength.get(random.nextInt(validLength.size()));
}

Voici une implémentation Python d'un module comme ça: http://www.mail-archive.com/python-list@python.org/msg125198.html Il devrait être portable Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top