Java 在最新的4.x版本中,如何将列表传递给jvm stepdef

Java 在最新的4.x版本中,如何将列表传递给jvm stepdef,java,regex,list,cucumber-jvm,Java,Regex,List,Cucumber Jvm,我有下面的枚举 public enum Color { RED, GREEN, BLUE } 在功能文件中,我有以下内容 Then verify policy status flow:RED, GREEN, BLUE 在steps文件中,我写道: @Then("verify policy status flow:{colorList}") public void verifyPolicyStatusFlow(List<Color> myColors) { } @

我有下面的枚举

public enum Color {
    RED, GREEN, BLUE
}
在功能文件中,我有以下内容

   Then verify policy status flow:RED, GREEN, BLUE
在steps文件中,我写道:

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

}
@Then(“验证策略状态流:{colorList}”)
public void verifyPolicyStatusFlow(列表颜色){
}
在实现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;
            }
        })
);
typeRegistry.defineParameterType(新的ParameterType(
“颜色列表”,
“(红|绿|蓝)(,\b(红|绿|蓝))*”,
List.class,
新变压器(){
@凌驾
公共列表转换(字符串s){
List collect=Arrays.stream(s.split(“,”).map(e->Color.valueOf(e)).collect(Collectors.toList());
回款到付;
}
})
);
但它不起作用。
如果我将正则表达式模式更改为“([^']*)”,它会工作。但是我希望正则表达式尽可能多限制

如果要匹配颜色列表红、绿、蓝,则只有尝试的第一组模式匹配3次,而第二组模式不匹配,因为空间不匹配

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

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

如果您没有引用代码中的组,还可以将其设置为非捕获:

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

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

除了第四个答案之外,您还可以使用
捕获组转换器来转换正则表达式中的捕获组。这样可以避免拆分和清理字符串

public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
    @Override
    public Locale locale() {
        return Locale.ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.defineParameterType(new ParameterType<>(
                "colorList",
                "(RED|GREEN|BLUE)(?:, (RED|GREEN|BLUE))*",
                List.class,
                new CaptureGroupTransformer<List>() {
                    @Override
                    public List<Color> transform(String... args) {
                        return Arrays.stream(args)
                                .map(Color::valueOf)
                                .collect(Collectors.toList());
                    }
                })
        );
    }
}
公共类TypeRegistryConfiguration实现TypeRegistryConfigurer{
@凌驾
公共区域设置(){
返回Locale.ENGLISH;
}
@凌驾
公共无效配置类型注册表(类型注册表类型注册表){
typeRegistry.defineParameterType(新参数类型(
“颜色列表”,
“(红|绿|蓝)(?:,(红|绿|蓝))*”,
List.class,
新CaptureGroupTransformer(){
@凌驾
公共列表转换(字符串…参数){
返回Arrays.stream(args)
.map(颜色::valueOf)
.collect(Collectors.toList());
}
})
);
}
}

尝试将单词边界替换为空格
(红色|绿色|蓝色)(,(红色|绿色|蓝色))*
可以!我不明白什么时候应该使用“?:”以及什么时候应该省略它?
?:
表示该组是非捕获组。您希望捕获
红色|绿色|蓝色
,但不捕获其前面的空格和逗号。所以你有一个非捕捉组,其中空格和逗号重复,在该组中另一个捕捉组捕捉颜色。