9

テスト目的で、Java の有限正規表現のすべての可能な値を列挙したいと考えています。

コンテキストによっては、許容される色の値を単語で一致させるために使用している正規表現があります。例として、短縮版を次に示します。

(white|black)|((light|dark) )?(red|green|blue|gray)

これらすべての値を列挙し、それらのそれぞれをユーティリティ クラスに渡し、これらの値からオブジェクトを生成する単体テストを作成したかったColorので、正規表現を変更すると、エラーが発生した場合に単体テストが失敗します (つまり、新しい色の値はサポートされていません)。

もちろん、列挙が可能であることは知っていますが(この質問を参照)、正規表現のすべての可能な一致を列挙するJava用の既存のライブラリはありますか?

編集:これを行うライブラリを実装しました。リンクについては、以下の私の回答を参照してください。

4

2 に答える 2

3

あなたは正しいです、オンラインでもそのようなツールを見つけられませんでした、しかしあなたはグーグルからXegerを試すことができます

正規表現からランダムに一致する文字列を作成でき、コードを微調整することで、必要な処理を実行できる場合があります。ランダム一致の生成:

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

Xegerコードは非常に単純で、5つのメソッドを含む2つのファイルで構成されて
います。dk.brics.automatonを使用して正規表現をオートマトンに変換し、オートマトン遷移を調べてすべてのノードでランダムに選択します。

主な機能は生成です:

   private void generate(StringBuilder builder, State state) {
    List<Transition> transitions = state.getSortedTransitions(true);
    if (transitions.size() == 0) {
        assert state.isAccept();
        return;
    }
    int nroptions = state.isAccept() ? transitions.size() : transitions.size() - 1;
    int option = XegerUtils.getRandomInt(0, nroptions, random);
    if (state.isAccept() && option == 0) {          // 0 is considered stop
        return;
    }
    // Moving on to next transition
    Transition transition = transitions.get(option - (state.isAccept() ? 1 : 0));
    appendChoice(builder, transition);
    generate(builder, transition.getDest());
}

可能なすべての一致を取得するように変更するには、すべての可能なノードで可能なすべての組み合わせを反復処理する必要があることがわかります(複数桁のカウンターのインクリメントなど)。ループを防ぐためにハッシュが必要ですが、そうではありません。コード化するのに5つ以上のセンコンドを取ります。

また、最初に正規表現が実際に完成していることを確認することをお勧めします。これには、このアクションを不可能にする*、+およびその他の記号がないことを確認します(これを再利用するための完全なツールにするため)...

于 2012-12-05T13:08:12.670 に答える