28

うん、あなたはその権利を読んだ。正規表現からランダムなテキストを生成できるものが必要です。したがって、テキストはランダムである必要がありますが、正規表現と一致します。存在しないようですが、間違っている可能性があります。

ほんの一例です。そのライブラリは、' [ab]*c'を入力として受け取り、次のようなサンプルを生成することができます。

abc
abbbc
bac

更新:私は自分で何かを作成しました:Xeger。http://code.google.com/p/xeger/をチェックしてください。

4

5 に答える 5

17

これを行うためのライブラリを1分前に作成しました。ここでホストされています:http ://code.google.com/p/xeger/ 。使用する前に注意深く読んでください。(特に、別の必要なライブラリのダウンロードを参照しているもの。);-)

これはあなたがそれを使う方法です:

String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
于 2009-10-17T17:33:10.833 に答える
7

私はそのようなライブラリを知りません。自分で作成することに興味がある場合は、おそらく次の手順を実行する必要があります。

  1. 正規表現のパーサーを作成します (正規表現の制限されたクラスから始めたいと思うかもしれません)。

  2. 結果を使用してNFAを構築します。

  3. (オプション) NFA をDFAに変換します。

  4. 結果のオートマトンを開始状態から任意の受け入れ状態までランダムにトラバースしながら、すべての遷移によって出力された文字を保存します。

結果は、元の正規表現によって受け入れられる単語です。詳細については、正規表現を決定論的有限オートマトンに変換するなどを参照してください。

于 2009-10-16T15:50:58.260 に答える
2

ここにそのような野獣 のいくつかの 実装がありますが、どれも Java では実装されていません (また、正規表現機能のサポートが非常に制限されているクローズド ソースの Microsoft のものを除く)。

于 2009-10-16T15:57:08.283 に答える
2

http://www.brics.dk/~amoeller/automaton/と共に Wilfred Springer のソリューションに基づいて、 別のジェネレーターを構築します。再帰を使用しません。パターン/正規表現の最小文字列長と最大文字列長を入力として受け取ります。結果は、最小長と最大長の間の許容される文字列です。また、XML の「短縮文字クラス」の一部も使用できます。これを、ファセットの有効な文字列を構築する XML サンプル ジェネレーターに使用します。

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()));
}
于 2013-04-30T20:23:55.127 に答える
0

これは、そのようなモジュールの Python 実装です: http://www.mail-archive.com/python-list@python.org/msg125198.html Java に移植できるはずです。

于 2010-07-19T14:25:47.177 に答える