gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:04 24 4
gpt4 key购买 nike

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

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

假设这些 ip(s) 与 ACME 相关联。在用户选择 ACME(在我们的 UI 中)的幕后,我正在填写一个包含所有这些可能数字的过滤器对象,并将它们作为 OR 查询提交到高度特化的 Vertica 数据库。

我只是无法确定从上述正则表达式创建数字列表的优雅方式。

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

有没有一种方法可以根据正则表达式生成列表?

感谢您的宝贵时间。

最佳答案

相关:

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

几种解决方案,例如将正则表达式转换为语法: Using Regex to generate Strings rather than match them


编辑:实际上,您可以让它工作!!!唯一要解决的问题是施加一些特定于域的约束以防止像 a+ 这样的组合爆炸。

如果您向 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());
}
}
}

... 和 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();
}

...你会得到这个:

-------------------------------------------------------
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

...然后,你猜怎么着。对于“[ab]{4,6}c”,它正确地产生了 112 个变体。

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

关于java - 在 Java 中,如何根据特定的正则表达式创建所有可能数字的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12923590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com