只是一个例子:该库能够将'[ab]*c
'作为输入,并生成以下示例:
abc
abbbc
BAC
等
更新:我自己创造了一些东西:Xeger。查看http://code.google.com/p/xeger/。
答案 0 :(得分:16)
我刚刚在一分钟前创建了一个库。它托管在这里: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);
答案 1 :(得分:7)
我不知道这样的图书馆。如果您有兴趣自己编写,那么这些可能是您需要采取的步骤:
为正则表达式编写解析器(您可能希望从限制类的正则表达式开始)。
使用结果构建NFA。
(可选)将NFA转换为DFA。
随机遍历生成的自动机从开始状态到任何接受状态,同时存储每次转换输出的字符。
结果是原始正则表达式接受的单词。有关更多信息,请参Converting a Regular Expression into a Deterministic Finite Automaton
答案 2 :(得分:2)
Here's a few implementations,但Java中没有一个(除了闭源微软,它们的regexp功能支持非常有限)。
答案 3 :(得分:2)
基于Wilfred Springer的解决方案 http://www.brics.dk/~amoeller/automaton/我建造另一台发电机。 它不使用递归。它接受patter / regularExpression最小字符串长度和最大字符串长度作为输入。结果是在最小和最大长度之间接受的字符串。它还允许一些XML“简写字符类”。 我将它用于为样本构建有效String的XML Sample Generator。
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()));
}
答案 4 :(得分:0)
这是一个像这样的模块的Python实现:http://www.mail-archive.com/python-list@python.org/msg125198.html它应该可以移植到Java。