8

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

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

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'
4

4 回答 4

14

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

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

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

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

于 2010-11-01T23:50:26.667 回答
4

当我将此 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
于 2013-01-24T09:39:09.627 回答
2

Rete 算法不是这样工作的。

我想你想在 Drools 中尝试正则表达式

于 2010-07-31T14:05:41.833 回答
0

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

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

因此,您可以对放置在 String Array 中的每个 String 调用不同的 String 函数。

于 2013-11-27T06:08:14.700 回答