流口水文件中的正则表达式

Regex in drool file

我在 drool 中使用正则表达式来验证密码。

    rule "Reset Password"
when
    $event : IIPEvent ( name == 'save')
    $vm : Login(userProfile != null)
then
    
    if($vm.getPassword().getValue() != null && $vm.getPassword().getValue().matches('^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$'))
    outcome.addFieldError('password', 'Password minimum eight characters, at least one letter and one number', $vm, false);
            
end

当我在 Tomcat 服务器中部署它时,出现以下异常

行11:104字符'd'没有可行的选择 第 11:113 行在字符 '\' 处没有可行的替代方案 2020 年 10 月 23 日 8:48:21 下午 org.drools.compiler.kie.builder.impl.AbstractKieModule buildKnowledgePackages 严重:无法构建 KieBaseModel:defaultKieBase 无法确定使用的声明。 java.lang.NullPointerException : [规则名称='Reset Password'] java.lang.NullPointerException

如果哪位知道如何解决,请告诉我

您应该在左侧而不是右侧进行匹配。这就是 'matches' 运算符的用途。

rule "Reset Password"
when
    exists(IIPEvent(name == "save"))
    $vm : Login( userProfile != null,
                 password != null,
                 password matches "(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$")
then
  outcome.addFieldError("password", "Password minimum eight characters, at least one letter and one number", $vm, false);
end

至于您收到错误的原因——您有 \d 而不是 \d。您需要转义字符串中字符 类 的反斜杠。您可以从错误消息中看出问题所在:no viable alternative at character 'd' 然后是 no viable alternative at character '\'.