我想我的一個條件是斷言的字符串不在字符串列表中。Drools與負向匹配
我使用決策表和我的病情細胞我有
firstName matches("?!($param)")
,並在參數電池我有
Billy|Joe|Bob
出於某種原因,當我有一個像莎莉它一個名字不符合該規則。如果我刪除它匹配的參數單元格中的「Billy | Joe | Bob」。
我應該提到我正在使用drools 3.0.6我看到提到的不匹配是在drools 4中添加的,但由於我不會進入的原因我無法升級。
我想我的一個條件是斷言的字符串不在字符串列表中。Drools與負向匹配
我使用決策表和我的病情細胞我有
firstName matches("?!($param)")
,並在參數電池我有
Billy|Joe|Bob
出於某種原因,當我有一個像莎莉它一個名字不符合該規則。如果我刪除它匹配的參數單元格中的「Billy | Joe | Bob」。
我應該提到我正在使用drools 3.0.6我看到提到的不匹配是在drools 4中添加的,但由於我不會進入的原因我無法升級。
我已經找到了最好的解決方案是這一拆分成多個條件的任何輸入。我希望我可以把這些都在一個條件,但要做到這一點我敢肯定,我需要去到至少4流口水
| firstName!="$param" | firstName!="$param" | firstName!="$param" |
|Billy |Joe |Bob |
注:原題使用的管道是被視爲「或」,而在這裏我使用管道來表示表格中的單元格。
否定式展望與否定表達式是完全不同的東西,我認爲是您在尋找的東西。
我不記得很多Drools 3,但你可能不得不使用eval表達式來否定它。所以,你的決定表格單元格會是什麼樣子
eval(! getFirstName().matches("($param)"))
基本上你在呼喚一個純Java的表達,而不是使用所提供的匹配操作。
你的領先支架不合適。
爲負看看語法前面就是:
(?!$param)
然而,單是這種變化是不夠的。您需要錨定的正則表達式:
^(?!.*$param)
此正則表達式表示「匹配任何輸入的是不包含$param
」。
因此,使用你的榜樣,^(?!.*Billy|Joe|Bob)
將匹配不包含Bill
,Joe
或Bob
我嘗試了這兩個,他們沒有工作。我相信你的正則表達式是正確的,但我有一個預測,drools 3.0不支持完整的正則表達式語法。 – AmishDave
我不認爲在drools 3中的決策表中允許eval。它在eval上表示意外標記。 – AmishDave
決策表只是用於生成規則的文本模板,因此它們確實接受了實驗,只是找到正確的語法。看看生成的規則,看看有什麼問題......它可能會幫助您解決問題。 –