枚举在Java中的正则表达式的可能匹配(Enumerate Possible Matches of

2019-08-03 11:29发布

我想列举在Java中用于测试的有限的正则表达式的所有可能的值。

对于某些方面,我有我使用匹配的话允许颜色值正则表达式。 下面是它的一个缩短版为例:

(white|black)|((light|dark) )?(red|green|blue|gray)

我想创建一个单元测试,将列举所有这些价值和他们每个人的传递到其产生的我的工具类, Color从这些对象,这样,如果我改变了正则表达式,我的单元测试如果发生错误,失败(即新的颜色值是不支持)。

我知道枚举是可能的,当然( 见这个问题 ),但有针对Java的现有库,这将枚举所有的正则表达式的可能匹配?

编辑:我实现了,这是否一个库。 请参阅下面的链接我的答案。

Answer 1:

你说得对,没有在网上找到这样的工具,以及,但你可以尝试Xeger从谷歌

它可以从一个正则表达式创建一个随机匹配的字符串,并与一些代码的调整可能会做你想要什么。 生成随机匹配:

String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);

Xeger代码很简单,它由含有它们之间的5种方法2个文件..
它采用dk.brics.automaton的正则表达式CONVER到自动机,然后越过过渡自动在每一个节点被随机选择。

主要功能是产生:

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

你可以看到,为了改变它,所以你得到所有可能的匹配,你需要遍历每个可能的节点所有可能的组合(如增加一个多位数计),您将需要一个哈希来防止环路,但是这不应该需要超过5个senconds到代码..

我也建议首先检查正则表达式实际上是finate,通过检查它没有*,+和其他符号,使这一行动是不可能的(只是为了让这个重复使用完整的工具)...



Answer 2:

对于未来这个问题未来的浏览器,我写了使用库dk.brics.automaton使用类似的方法来Xeger从接受的答案并公布它。 你可以找到它:

  • 在GitHub上
  • 在项目现场
  • 在Maven的中央

将其添加为一个依赖关系:

Maven的

<dependency>
    <groupId>com.navigamez</groupId>
    <artifactId>greex</artifactId>
    <version>1.0</version>
</dependency>

摇篮

compile 'com.navigamez:greex:1.0'

示例代码

使用这个问题作为一个例子:

GreexGenerator generator = new GreexGenerator("(white|black)|((light|dark) )?(red|green|blue|gray)");
List<String> matches = generator.generateAll();
System.out.println(matches.size()); // "14"


文章来源: Enumerate Possible Matches of Regular Expression in Java