代码之家  ›  专栏  ›  技术社区  ›  Wilfred Springer

如何从正则表达式生成与正则表达式匹配的文本?

  •  28
  • Wilfred Springer  · 技术社区  · 16 年前

    是的,你没看错。我需要有能力的东西 生成 正则表达式中的随机文本。因此,文本应该是随机的,但要与正则表达式匹配。它似乎不存在,但我可能错了。

    举个例子:那个图书馆有能力 [ab]*c

    abc
    abbc

    http://code.google.com/p/xeger/ .

    5 回复  |  直到 11 年前
        1
  •  16
  •   Wilfred Springer    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);
    
        2
  •  7
  •   Stephan202 Alex Martelli    16 年前

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

    1. 为正则表达式编写一个解析器(您可能希望从一个受限的正则表达式类开始)。

    2. 使用结果构造 NFA .

    3. (可选)将NFA转换为 DFA .

    Converting a Regular Expression into a Deterministic Finite Automaton .

        3
  •  2
  •   Michael Borgwardt    16 年前

    Here's a few implementations 这种野兽,但没有一个是Java的(除了闭源的微软,其他所有的都在正则表达式功能支持方面非常有限)。

        4
  •  2
  •   SkateScout    13 年前

    http://www.brics.dk/~amoeller/automaton/ 我又造了一台发电机。 我将其用于为方面构建有效字符串的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()));
    }
    
        5
  •  0
  •   Gaslight Deceive Subvert    15 年前

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

    推荐文章