如何生成文本从正则表达式匹配正则表达式? [关闭](How do I generate text

2019-08-19 06:37发布

是的,你没有看错。 我需要的东西,能够从正则表达式生成随机文本。 因此文本应该是随机的,但正则表达式匹配。 好像它不存在,但我可能是错的。

只是一个例子:该库将能够采取“ [ab]*c ”作为输入,并产生样品诸如:

ABC
abbbc
BAC

等等

更新:我创建了自己的东西:Xeger。 退房http://code.google.com/p/xeger/ 。

Answer 1:

我刚刚创建了一个库,这样一分钟前。 它在这里举行: 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);


Answer 2:

我不知道这样的库。 如果你有兴趣自己写一个,那么这些可能是你需要采取的步骤:

  1. 写正则表达式(你可能想用有限的一类正则表达式的开始出)的分析器。

  2. 使用结果构建一个NFA 。

  3. (可选)转换NFA到DFA 。

  4. 随机遍历从开始状态所得到的自动机接受任何状态,而存储由每个转换输出的字符。

其结果是由原始的正则表达式接受一个字。 如需更多信息,请参见例如转换正则表达式为确定性有限自动机



Answer 3:

这里有 几个 实现这样的野兽,但他们都不在Java中(和所有,但封闭源代码的微软一个在他们的正则表达式的功能支持非常有限)。



Answer 4:

基于威尔弗雷德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()));
}


Answer 5:

这里就像是一个模块的Python实现: http://www.mail-archive.com/python-list@python.org/msg125198.html它应该可以移植到Java。



文章来源: How do I generate text matching a regular expression from a regular expression? [closed]