我希望我的条件之一是断言的字符串不在字符串列表中。
我正在使用决策表,在我的条件单元格中我有
firstName matches("?!($param)")
在我的参数单元格中
Billy|Joe|Bob
出于某种原因,当我有一个像 Sally 这样的名字时,它不符合该规则。如果我从它匹配的参数单元格中删除“Billy|Joe|Bob”。
我可能应该提到我正在使用 drools 3.0.6 我看到提到了在 drools 4 中添加的不匹配但由于我不会进入的原因我无法升级。
The best solution I've found is to split this into multiple conditions. I wish I could place these all in one condition but to do that I'm pretty sure I'd need to go up to at least drools 4.
| firstName!="$param" | firstName!="$param" | firstName!="$param" |
|Billy |Joe |Bob |
Note: The use of pipes in the original question was to be treated as an "or" whereas here I'm using pipes to denote cells in the table.
你的前括号不合适。
否定前瞻的语法是:
(?!$param)
但是,仅此更改是不够的。您需要锚定正则表达式:
^(?!.*$param)
这个正则表达式说“匹配任何不包含$param”的输入。
因此,使用您的示例,^(?!.*Billy|Joe|Bob)将匹配任何不包含的输入Bill,Joe或Bob
否定前瞻与否定表达式完全不同,我认为这就是您要寻找的。
我不太记得 Drools 3,但您可能必须使用 eval 表达式来否定它。所以你的决策表单元格看起来像
eval( ! getFirstName().matches("($param)") )
基本上,您调用的是纯 java 表达式,而不是使用提供的匹配运算符。