2012-08-24 44 views
1

我想我的一個條件是斷言的字符串不在字符串列表中。Drools與負向匹配

我使用決策表和我的病情細胞我有

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

,並在參數電池我有

Billy|Joe|Bob 

出於某種原因,當我有一個像莎莉它一個名字不符合該規則。如果我刪除它匹配的參數單元格中的「Billy | Joe | Bob」。

我應該提到我正在使用drools 3.0.6我看到提到的不匹配是在drools 4中添加的,但由於我不會進入的原因我無法升級。

回答

0

我已經找到了最好的解決方案是這一拆分成多個條件的任何輸入。我希望我可以把這些都在一個條件,但要做到這一點我敢肯定,我需要去到至少4流口水

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

注:原題使用的管道是被視爲「或」,而在這裏我使用管道來表示表格中的單元格。

0

否定式展望與否定表達式是完全不同的東西,我認爲是您在尋找的東西。

我不記得很多Drools 3,但你可能不得不使用eval表達式來否定它。所以,你的決定表格單元格會是什麼樣子

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

基本上你在呼喚一個純Java的表達,而不是使用所提供的匹配操作。

+0

我不認爲在drools 3中的決策表中允許eval。它在eval上表示意外標記。 – AmishDave

+0

決策表只是用於生成規則的文本模板,因此它們確實接受了實驗,只是找到正確的語法。看看生成的規則,看看有什麼問題......它可能會幫助您解決問題。 –

0

你的領先支架不合適。

爲負看看語法前面就是:

(?!$param) 

然而,單是這種變化是不夠的。您需要錨定的正則表達式:

^(?!.*$param) 

此正則表達式表示「匹配任何輸入的是包含$param」。

因此,使用你的榜樣,^(?!.*Billy|Joe|Bob)將匹配不包含BillJoeBob

+0

我嘗試了這兩個,他們沒有工作。我相信你的正則表達式是正確的,但我有一個預測,drools 3.0不支持完整的正則表達式語法。 – AmishDave