Bri*_*ian 9 java regex enumeration
我想在Java中枚举有限正则表达式的所有可能值以用于测试目的.
对于某些上下文,我有一个正则表达式,我用它来匹配单词中允许的颜色值.这是一个缩短版本的例子:
(white|black)|((light|dark) )?(red|green|blue|gray)
Run Code Online (Sandbox Code Playgroud)
我想创建一个单元测试,它将枚举所有这些值并将它们传递给我的实用程序类,该实用程序类Color从这些生成一个对象,这样,如果我更改正则表达式,我的单元测试将在发生错误时失败(即不支持新的颜色值).
我知道枚举是可能的,当然(见这个问题),但有针对Java的现有库,这将枚举所有的正则表达式的可能匹配?
编辑:我已经实现了一个执行此操作的库.请参阅下面的答案以获取链接.
你是对的,在网上也没有找到这样的工具,但你可以尝试谷歌的Xeger
它可以从正则表达式创建随机匹配字符串,并且通过一些代码调整可能会达到您想要的效果。生成随机匹配:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Run Code Online (Sandbox Code Playgroud)
Xeger 代码非常简单,它由 2 个文件组成,其中包含 5 个方法。
它使用 dk.brics.automaton 将正则表达式转换为自动机,然后遍历自动机转换,在每个节点中进行随机选择。
主要功能是生成:
private void generate(StringBuilder builder, State state) {
List<Transition> transitions = state.getSortedTransitions(true);
if (transitions.size() == 0) {
assert state.isAccept();
return;
}
int nroptions = state.isAccept() ? transitions.size() : transitions.size() - 1;
int option = XegerUtils.getRandomInt(0, nroptions, random);
if (state.isAccept() && option == 0) { // 0 is considered stop
return;
}
// Moving on to next transition
Transition transition = transitions.get(option - (state.isAccept() ? 1 : 0));
appendChoice(builder, transition);
generate(builder, transition.getDest());
}
Run Code Online (Sandbox Code Playgroud)
您可以看到,为了更改它以便获得所有可能的匹配项,您需要迭代每个可能节点中的所有可能组合(例如递增多位计数器),您将需要一个哈希来防止循环,但这不应该编码时间超过 5 秒..
我还建议首先检查正则表达式是否确实是finate,通过检查它是否有 *、+ 和其他使此操作不可能的符号(只是为了使其成为一个可供重用的完整工具)...