28

是的,你没看错。我需要能够从正则表达式生成随机文本的东西。所以文本应该是随机的,但要通过正则表达式匹配。它似乎不存在,但我可能是错的。

只是一个例子:该库将能够以 ' [ab]*c' 作为输入,并生成示例,例如:

abc
abbc
bac

等等

更新:我自己创造了一些东西:Xeger。查看http://code.google.com/p/xeger/

4

5 回答 5

17

我刚刚创建了一个库来执行此操作。它托管在这里: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

基于 Wilfred Springer 的解决方案以及 http://www.brics.dk/~amoeller/automaton/我构建了另一个生成器。它不使用递归。它将模式/regularExpression 最小字符串长度和最大字符串长度作为输入。结果是最小和最大长度之间的可接受字符串。它还允许一些 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 回答