関連している:
正規表現に一致するデータを生成するライブラリ (制限あり):
http://code.google.com/p/xeger/
正規表現を文法に変換するなど、いくつかの解決策: 正規表現を
使用して文字列を照合するのではなく生成する
編集:実際には、それを機能させることができます!!! 対処すべき唯一のことは、ドメイン固有の制約を課して、a+ のような組み合わせの爆発を防ぐことです。
Xeger クラスに次のようなものを追加すると:
public void enumerate() {
System.out.println("enumerate: \"" + regex + "\"");
int level = 0;
String accumulated = "";
enumerate(level, accumulated, automaton.getInitialState());
}
private void enumerate(int level, String accumulated, State state) {
List<Transition> transitions = state.getSortedTransitions(true);
if (state.isAccept()) {
System.out.println(accumulated);
return;
}
if (transitions.size() == 0) {
assert state.isAccept();
return;
}
int nroptions = state.isAccept() ? transitions.size() : transitions.size() - 1;
for (int option = 0; option <= nroptions; option++) {
// Moving on to next transition
Transition transition = transitions.get(option - (state.isAccept() ? 1 : 0));
for (char choice = transition.getMin(); choice <= transition.getMax(); choice++) {
enumerate(level + 1, accumulated + choice, transition.getDest());
}
}
}
...そしてXegerTestに次のようなもの:
@Test
public void enumerateAllVariants() {
//String regex = "[ab]{4,6}c";
String regex = "34\\.25\\.14\\.(227|228|229|230|243|244|245|246)";
Xeger generator = new Xeger(regex);
generator.enumerate();
}
...これを取得します:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.flotsam.xeger.XegerTest
enumerate: "34\.25\.14\.(227|228|229|230|243|244|245|246)"
34.25.14.227
34.25.14.228
34.25.14.229
34.25.14.243
34.25.14.244
34.25.14.245
34.25.14.246
34.25.14.230
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.114 sec
...そして、何を推測します。"[ab]{4,6}c" の場合、112 のバリアントが正しく生成されます。
これは本当に簡単で汚い実験ですが、うまくいくようです ;)。