2010-07-31 14 views
7

有没有人知道在drools中是否有办法做循环?是为了循环可能在流口水?

我想通过一个字符串列表来查看是否有一个字符串匹配一个模式,例如

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' 

回答

12

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

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

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

你可能也想看看全局和查询。 global可以让你在你的工作记忆中注入一个服务来调用你的后果,而查询可能是你从工作记忆中获得匹配字符串的一种方式。

2

Rete算法不以这种方式工作。我想你想试试regex in Drools

+0

感谢您的链接,但在那里的例子只搜索一个字符串,看看它是否匹配正则表达式。 在我的例子我可以使用 “ABC”匹配“^ AB * $” 但是,这心不是我试图实现,我想寻找一个字符串列表,看看其中是否匹配正表达。 我不认为这是造成我的问题的正则表达式部分。这是事实,我不知道如何遍历drools中的字符串列表。 你知道我怎么能做到这一点? 谢谢 – MTH 2010-07-31 14:53:25

+0

我不确定,但我猜你想看看应用正则表达式到列表中。 “至少匹配一个”,“匹配一个或多个”是我会寻找的东西。如果你没有在Drools中找到循环,那是因为它不应该以这种方式工作。 – duffymo 2010-07-31 15:02:27

+0

你知道吗有没有办法将java代码嵌入到规则中? – MTH 2010-07-31 16:01:33

3

我已经使用这个命令时,我用这个DRL文件作为规则为我的项目

希望这可以对您有所帮助。

package com.sample

import com.sample。HelloProcessModel;

规则 “NYuser_Rule”

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

规则 “ChileUser_Rule”

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

规则 “BelgiumUser_Rule”

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

结束

0

我也迭代了String[]并在String []的每个字符串上使用String的这个函数。这是我在用的...

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

所以,你可以调用放在字符串数组中的每个字符串字符串的不同功能。