Drools匹配负向前瞻

时间:2012-08-24 22:35:22

标签: regex drools

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

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

firstName matches("?!($param)")

在param单元格中我有

Billy|Joe|Bob

由于某种原因,当我有一个像莎莉这样的名字时,它并不匹配该规则。如果我删除" Billy | Joe | Bob"来自它匹配的param单元格。

我应该提到我使用drools 3.0.6我看到提到了drools 4中添加的不匹配但是由于我不能进入的原因我无法升级。

3 个答案:

答案 0 :(得分:0)

负面向前看是与否定表达完全不同的东西,我认为是你在寻找的东西。

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

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

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

答案 1 :(得分:0)

您的前导支架不合适。

前瞻性的语法是:

(?!$param)

然而,仅凭这一改变是不够的。你需要锚定正则表达式:

^(?!.*$param)

此正则表达式“匹配包含$param”的任何输入。

因此,使用您的示例,^(?!.*Billy|Joe|Bob)会匹配任何不包含BillJoeBob

的输入

答案 2 :(得分:0)

我发现的最佳解决方案是将其拆分为多个条件。我希望我可以把这些都放在一个条件下,但为了做到这一点,我很确定我需要至少流口水4。

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

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