Jak wygenerować tekst pasujący do wyrażenia regularnego z wyrażenia regularnego? [zamknięte]

Tak, dobrze to przeczytałeś. Potrzebuję czegoś, co jest w stanie wygenerować losowy tekst z wyrażenia regularnego. Tak więc tekst powinien być losowy, ale musi być dopasowany do wyrażenia regularnego. Wygląda na to, że nie istnieje, ale mogę się mylić.

Tylko przykład: ta biblioteka byłaby w stanie przyjąć '[ab]*c' jako dane wejściowe i wygenerować próbki takie jak:

Abc
abbbc
bac

Itd.

Update: sam coś stworzyłem: Xeger. Sprawdź http://code.google.com/p/xeger/.

Author: Wilfred Springer, 2009-10-16

5 answers

Przed chwilą stworzyłem do tego bibliotekę. Hostujemy Zdjęć: http://code.google.com/p/xeger / . Przed użyciem uważnie przeczytaj instrukcję. (Szczególnie ta odnosząca się do pobrania innej wymaganej biblioteki.) ;-)

Tak się go używa:

String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
 16
Author: Wilfred Springer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-17 17:33:10

Nie znam takiej biblioteki. Jeśli jesteś zainteresowany napisaniem jednego samodzielnie, to prawdopodobnie są to kroki, które musisz podjąć:

  1. Napisz parser dla wyrażeń regularnych(możesz zacząć od ograniczonej klasy wyrażeń regularnych).

  2. Użyj wyniku do skonstruowania NFA.

  3. (opcjonalne) Konwersja NFA na DFA.

  4. Losowo przemierzać wynikowy automat ze stanu początkowego do dowolnego akceptowanie stanu, podczas przechowywania znaków wyprowadzanych przez każde przejście.

Wynikiem jest słowo, które jest akceptowane przez oryginalne wyrażenia regularne. Więcej, patrz np. przekształcenie wyrażenia regularnego w deterministyczny Automat skończony.

 7
Author: Stephan202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-16 15:50:58

Oto Kilka implementacje takiej bestii, ale żadna z nich nie jest w Javie(i wszystkie poza zamkniętymi źródłami Microsoftu bardzo ograniczone w obsłudze funkcji regexp).

 2
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-16 15:57:08

Na podstawie rozwiązania Wilfreda Springera wraz z http://www.brics.dk/amoeller/automaton / buduję kolejny generator. Nie używa rekursji. Przyjmuje jako wejście patter/regularExpression minimalną długość łańcucha i maksymalną długość łańcucha. Rezultatem jest zaakceptowany ciąg o długości min i max. Pozwala również na niektóre z XML "klasy znaków krótkiej ręki". Używam tego do generatora próbek XML, który buduje poprawny ciąg znaków dla aspektów.

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()));
}
 2
Author: SkateScout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 20:23:55

Oto implementacja Pythona takiego modułu: http://www.mail-archive.com/[email protected]/msg125198.html powinien być przenośny do Javy.

 0
Author: Björn Lindqvist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-19 14:25:47