在Java中,如何从特定正则表达式创建所有可能数字的列表?

D-K*_*otz 14 java regex

我有一个奇怪的问题,至少有一个我从未遇到过的问题.我有一个前提条件,客户有简单的正则表达式与标签相关联.标签是他们关心的.我想要做的是创建一个列表,列出所有可能匹配这些正则表达式的数字.当列表超出某个阈值时,我会有逻辑警告我.

以下是正则表达式的示例: 34.25.14.(227|228|229|230|243|244|245|246)

让我们说这些ip与ACME有关.在用户选择ACME(在我们的UI中)的幕后,我填写了一个包含所有这些可能数字的过滤器对象,并将它们作为OR查询提交给高度专业化的Vertica数据库.

我无法确定从所述正则表达式创建数字列表的优雅方式.

另一方面,产品的另一部分中的java代码使用这些正则表达式通过使用java Pattern.compile()来显示ACME,这意味着客户'可以'创建复杂的正则表达式.到目前为止,我只看到它们,使用如上所示的简单方法.

是否有一种方法可以生成基于正则表达式的列表?

谢谢你的时间.

ful*_*.ex 6

有关:

生成与正则表达式匹配的数据的库(有限制):http: //code.google.com/p/xeger/

几种解决方案,例如将正则表达式转换为语法: 使用Regex生成字符串而不是匹配它们


编辑:实际上,你可以让它工作!要解决的唯一问题是强加一些特定于域的约束来排除像+一样的组合爆炸.

如果您向Xeger类添加如下内容:

public void enumerate() {
    System.out.println("enumerate: \"" + regex + "\"");
    int level = 0;
    String accumulated = "";
    enumerate(level, accumulated, automaton.getInitialState());
}

private void enumerate(int level, String accumulated, State state) {
    List<Transition> transitions = state.getSortedTransitions(true);
    if (state.isAccept()) {
        System.out.println(accumulated);
        return;
    }
    if (transitions.size() == 0) {
        assert state.isAccept();
        return;
    }
    int nroptions = state.isAccept() ? transitions.size() : transitions.size() - 1;
    for (int option = 0; option <= nroptions; option++) {
        // Moving on to next transition
        Transition transition = transitions.get(option - (state.isAccept() ? 1 : 0));
        for (char choice = transition.getMin(); choice <= transition.getMax(); choice++) {
            enumerate(level + 1, accumulated + choice, transition.getDest());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

......和XegerTest这样的东西:

@Test
public void enumerateAllVariants() {
    //String regex = "[ab]{4,6}c";
    String regex = "34\\.25\\.14\\.(227|228|229|230|243|244|245|246)";
    Xeger generator = new Xeger(regex);
    generator.enumerate();
}
Run Code Online (Sandbox Code Playgroud)

......你会得到这个:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running nl.flotsam.xeger.XegerTest
enumerate: "34\.25\.14\.(227|228|229|230|243|244|245|246)"
34.25.14.227
34.25.14.228
34.25.14.229
34.25.14.243
34.25.14.244
34.25.14.245
34.25.14.246
34.25.14.230
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.114 sec
Run Code Online (Sandbox Code Playgroud)

... 你猜怎么着.对于"[ab] {4,6} c",它正确地产生112个变体.

这真的是一个快速而肮脏的实验,但似乎有效;).

  • 不要只发布链接 - 至少包括它们包含的内容的摘要,并显示它们的相关性. (3认同)
  • 伙计们,这是一个很好的答案(+1).我打电话给你投票.其他讨论的链接非常有用(恕我直言).在那里标记为正确的答案解释了如何提取正则表达式的内部表示的部分. (2认同)