首页 > 解决方案 > 如何在最新的 4.x 版本中将列表传递给 cucumber-jvm stepdef

问题描述

我有以下枚举

public enum Color {
    RED, GREEN, BLUE
}

在功能文件中,我有以下内容

   Then verify policy status flow:RED, GREEN, BLUE

在步骤文件中,我写道:

@Then("verify policy status flow:{colorList}")
public void verifyPolicyStatusFlow(List<Color> myColors) {

}

在实现TypeRegistryConfigurer的类中,我写了

typeRegistry.defineParameterType(new ParameterType<List>(
        "colorList",
        "(RED|GREEN|BLUE)(,\b(RED|GREEN|BLUE))*", 
        List.class,
        new Transformer<List>() {
            @Override
            public List<Color> transform(String s) {
                List<Color> collect = Arrays.stream(s.split(", ")).map(e -> Color.valueOf(e)).collect(Collectors.toList());
                return collect;
            }
        })
);

但它不起作用。如果我将正则表达式模式更改为“([^']*)” ,它就可以工作。但我希望正则表达式尽可能地受到限制

标签: javaregexlistcucumber-jvm

解决方案


如果您想匹配颜色列表 RED、GREEN、BLUE,只有您尝试的图案的第一组将匹配 3 次,而第二组图案不匹配,因为没有匹配空格。

如果匹配空格,可以省略单词边界\b

(RED|GREEN|BLUE)(, (RED|GREEN|BLUE))*

正则表达式演示

如果您没有引用代码中的组,您也可以将它们设为非捕获:

(?:RED|GREEN|BLUE)(?:, (?:RED|GREEN|BLUE))*

该模式([^']*)将捕获匹配 0+ 次而不是 a 的组',并且还将匹配一个空字符串。


推荐阅读