Regex Drools与负前瞻匹配

Regex Drools与负前瞻匹配,regex,drools,Regex,Drools,我希望我的条件之一是断言的字符串不在字符串列表中 我正在使用决策表,在我的条件单元格中 firstName matches("?!($param)") Billy|Joe|Bob 在param牢房里我有 firstName matches("?!($param)") Billy|Joe|Bob 由于某种原因,当我有一个像萨利这样的名字时,它不符合这个规则。如果我从param单元格中删除“Billy | Joe | Bob”,它将匹配 我可能应该提到,我正在使用drools 3.0.6,我

我希望我的条件之一是断言的字符串不在字符串列表中

我正在使用决策表,在我的条件单元格中

firstName matches("?!($param)")
Billy|Joe|Bob
在param牢房里我有

firstName matches("?!($param)")
Billy|Joe|Bob
由于某种原因,当我有一个像萨利这样的名字时,它不符合这个规则。如果我从param单元格中删除“Billy | Joe | Bob”,它将匹配


我可能应该提到,我正在使用drools 3.0.6,我看到drools 4中添加了一个不匹配项,但出于我无法进入的原因,我无法升级。

消极的前瞻性与否定表达式完全不同,我认为这是您要寻找的

我不太记得Drools 3,但您可能需要使用eval表达式来否定它。所以你的决策表单元格看起来像

eval( ! getFirstName().matches("($param)") )

基本上,您调用的是纯java表达式,而不是使用提供的matches运算符。

前面的括号不合适

消极前瞻的语法是:

(?!$param)
然而,单凭这一改变是不够的。您需要锚定正则表达式:

^(?!.*$param)
这个正则表达式表示“匹配任何不包含
$param
的输入”


因此,使用您的示例,
^(?。*Billy | Joe | Bob)
将匹配任何不包含
Bill
Joe
Bob
的输入。我发现的最佳解决方案是将其拆分为多个条件。我希望我能把所有这些都放在一个条件下,但要做到这一点,我非常确定我需要至少达到4流口水

| firstName!="$param" | firstName!="$param" | firstName!="$param" |
|Billy                |Joe                  |Bob                  |

注意:原始问题中管道的使用被视为“或”,而这里我使用管道来表示表中的单元格。

我尝试了这两种方法,但都不起作用。我相信你的正则表达式是正确的,但我有一种预感,drools 3.0不支持完整的正则表达式语法。我认为drools 3的决策表中不允许使用eval。它说eval上有意外的标记。决策表只是生成规则的文本模板,所以它们确实接受eval,只需找到正确的语法即可。看看生成的规则,看看有什么不对。。。它可能会帮助你修复它。