在drools中是否可以使用for循环?

在drools中是否可以使用for循环?,drools,Drools,有人知道有没有一种方法可以治疗口水循环吗 我正在尝试循环浏览字符串列表,以查看其中一个字符串是否与模式匹配,例如 def listOfStrings = ['a','a.b','a.b.c'] for(String s:listOfStrings){ if(s matches "^a.b.*$"){ return true } } 我根据我能找到的文档编写了以下规则,但我认为语法不正确 rule "Matcher" when TestClass : TestClas

有人知道有没有一种方法可以治疗口水循环吗

我正在尝试循环浏览字符串列表,以查看其中一个字符串是否与模式匹配,例如

def listOfStrings = ['a','a.b','a.b.c']

for(String s:listOfStrings){
 if(s matches "^a.b.*$"){
 return true 
 }
}
我根据我能找到的文档编写了以下规则,但我认为语法不正确

rule "Matcher"
   when
      TestClass : TestClass(($s matches "^a.b.*$") from listOfStrings, count($s))
   then
      TestClass.setResponse( "Condition is True !!" );
end
我发现很难找到关于drl语言的好文档

如果有人能给我帮助,我将不胜感激


根据前面的答案,我尝试了以下方法

rule "Matcher"
  when
 TestClass:TestClass(String( this matches "^a.b.*$" ) from listOfStrings)
then
       TestClass.setResponse( "Condition is True !!" );
end 
但是,我现在收到以下错误消息:

[43,197]: unknown:43:197 Unexpected token 'this'

Rete算法不是这样工作的


我想你想试试。

我想你误解了规则引擎的基本原理;你需要有点不同的想法

您需要将列表分解为其组件字符串,并将它们作为事实单独插入工作内存,而不是对列表进行“迭代”

只有与“when”条件匹配的字符串/事实才会触发规则


您可能还想查看全局变量和查询。global将允许您将服务注入工作内存,以便调用,查询可能是一种从工作内存中获取匹配字符串的方法。

当我将此drl文件用作项目规则时,我使用了此命令

希望这对你有所帮助

package com.sample

import com.sample.HelloProcessModel;

rule "NYuser_Rule"

    no-loop true
    ruleflow-group "EvalLoopcondition"
    when
        m:HelloProcessModel(userlocation in ("NewYorkUser"), count < 4)
    then
        m.setLoopcondition(6);update(m);
end


rule "ChileUser_Rule"

    no-loop true
    ruleflow-group "EvalLoopcondition"
    when
        m:HelloProcessModel(userlocation in ("ChileUser"), count < 3)
    then
        m.setLoopcondition(5);update(m);
end


rule "BelgiumUser_Rule"

    no-loop true
    ruleflow-group "EvalLoopcondition"
    when
        m:HelloProcessModel(userlocation in ("BelgiumUser"), count < 6)
    then
        m.setLoopcondition(8);update(m);
end
package.com.sample
导入com.sample.HelloProcessModel;
规则“NYuser\U规则”
无循环为真
规则流组“EvalLoopcondition”
什么时候
m:HelloProcessModel(用户位置在(“NewYorkUser”),计数<4)
然后
m、 设置循环条件(6);更新(m);
结束
规则“ChileUser_规则”
无循环为真
规则流组“EvalLoopcondition”
什么时候
m:HelloProcessModel(用户位置在(“ChileUser”),计数<3)
然后
m、 设置循环条件(5);更新(m);
结束
规则“BelgiumUser_规则”
无循环为真
规则流组“EvalLoopcondition”
什么时候
m:HelloProcessModel(用户位置在(“BelgiumUser”),计数<6)
然后
m、 设置循环条件(8);更新(m);
结束

我也在迭代
字符串[]
并对字符串[]中的每个字符串使用字符串函数。这就是我正在使用的

String($vvl.indexOf(String.valueOf(charAt($idx)))>=0)
from
$m.stringArray


因此,您可以对放置在字符串数组中的每个字符串调用字符串的不同函数。

感谢您提供的链接,但这里的示例只搜索字符串以查看它是否与正则表达式匹配。在我的示例中,我可以使用“a.b.c”匹配“^a.b.*$”,但这不是我想要实现的,我正在尝试搜索字符串列表,以查看其中是否有匹配正则表达式的字符串。我不认为是正则表达式部分给我带来了问题。事实上,我不知道如何遍历drools中的字符串列表。你知道我怎样才能做到这一点吗?谢谢我不确定,但我猜你想看看如何将正则表达式应用于列表。“至少匹配一个”,“匹配一个或多个”是我想要的东西。如果你在Drools中找不到循环,那是因为它不应该以这种方式工作。你知道有没有办法将java代码嵌入到规则中吗?@MTH你可以使用Drools的eval()函数,查看java中的表达式是否为真/假。我的经验是,评估是有限的,需要一些尝试/错误才能使其正常工作。你能添加一些解释或参考链接吗?