是的,你没有看错。 我需要的东西,能够从正则表达式生成随机文本。 因此文本应该是随机的,但正则表达式匹配。 好像它不存在,但我可能是错的。
只是一个例子:该库将能够采取“ [ab]*c
”作为输入,并产生样品诸如:
ABC
abbbc
BAC
等等
更新:我创建了自己的东西:Xeger。 退房http://code.google.com/p/xeger/ 。
是的,你没有看错。 我需要的东西,能够从正则表达式生成随机文本。 因此文本应该是随机的,但正则表达式匹配。 好像它不存在,但我可能是错的。
只是一个例子:该库将能够采取“ [ab]*c
”作为输入,并产生样品诸如:
ABC
abbbc
BAC
等等
更新:我创建了自己的东西:Xeger。 退房http://code.google.com/p/xeger/ 。
我刚刚创建了一个库,这样一分钟前。 它在这里举行: 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);
我不知道这样的库。 如果你有兴趣自己写一个,那么这些可能是你需要采取的步骤:
写正则表达式(你可能想用有限的一类正则表达式的开始出)的分析器。
使用结果构建一个NFA 。
(可选)转换NFA到DFA 。
随机遍历从开始状态所得到的自动机接受任何状态,而存储由每个转换输出的字符。
其结果是由原始的正则表达式接受一个字。 如需更多信息,请参见例如转换正则表达式为确定性有限自动机 。
这里有 几个 实现这样的野兽,但他们都不在Java中(和所有,但封闭源代码的微软一个在他们的正则表达式的功能支持非常有限)。
基于威尔弗雷德Springer的解决方案一起http://www.brics.dk/~amoeller/automaton/我建一个发电机。 它不使用递归。 它作为输入的图案/正则表达式的最小字符串长度和最大字符串长度。 其结果是最小和最大长度之间的公认的字符串。 这也让一些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()));
}
这里就像是一个模块的Python实现: http://www.mail-archive.com/python-list@python.org/msg125198.html它应该可以移植到Java。