【问题标题】:are for loops possible in drools?流口水可以循环吗?
【发布时间】:2011-03-23 15:28:40
【问题描述】:

有人知道是否有办法在流口水中进行 for 循环吗?

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

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'

【问题讨论】:

    标签: drools


    【解决方案1】:

    我认为您误解了规则引擎的基本原理;你需要换个思路。

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

    只有符合“何时”条件的字符串/事实才会触发规则。

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

    【讨论】:

      【解决方案2】:

      当我将此 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
      

      【讨论】:

      • 你能添加一些解释或一些参考链接吗?
      【解决方案3】:

      Rete 算法不能这样工作。

      我想你想试试regex in Drools

      【讨论】:

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

      我还在迭代String[] 并在String[] 中的每个String 上使用String 的这个函数。这就是我正在使用的......

      String ( $vvl.indexOf( String.valueOf( charAt($idx)) ) &gt;= 0 ) 来自$m.stringArray

      所以你可以在每个放在String Array中的String上调用不同的String函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2015-12-09
        • 2021-08-04
        • 1970-01-01
        • 2018-03-12
        • 2018-11-05
        相关资源
        最近更新 更多