我有一个奇怪的问题,至少有一个我从未遇到过的问题.我有一个前提条件,客户有简单的正则表达式与标签相关联.标签是他们关心的.我想要做的是创建一个列表,列出所有可能匹配这些正则表达式的数字.当列表超出某个阈值时,我会有逻辑警告我.
以下是正则表达式的示例: 34.25.14.(227|228|229|230|243|244|245|246)
让我们说这些ip与ACME有关.在用户选择ACME(在我们的UI中)的幕后,我填写了一个包含所有这些可能数字的过滤器对象,并将它们作为OR查询提交给高度专业化的Vertica数据库.
我无法确定从所述正则表达式创建数字列表的优雅方式.
另一方面,产品的另一部分中的java代码使用这些正则表达式通过使用java Pattern.compile()来显示ACME,这意味着客户'可以'创建复杂的正则表达式.到目前为止,我只看到它们,使用如上所示的简单方法.
是否有一种方法可以生成基于正则表达式的列表?
谢谢你的时间.
有关:
生成与正则表达式匹配的数据的库(有限制):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个变体.
这真的是一个快速而肮脏的实验,但似乎有效;).