2010-07-31 5 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

Я думаю, вы неправильно поняли основы механизма правил; вам нужно думать немного по-другому.

Вместо «итерации» по списку вам нужно разбить список на его составные строки и вставить их отдельно как факты в рабочую память.

Только строки/факты, которые соответствуют условию «когда», будут увольнять правило.

Возможно, вы также захотите ознакомиться с глобалями и запросами. глобальный позволит вам внедрить службу в вашу рабочую память для ваших последствий для вызова, а запрос может быть способом, с помощью которого вы можете получить соответствие строк из рабочей памяти.

2

Алгоритм Rete не работает таким образом.

Я думаю, вы хотите попробовать regex in Drools.

+0

Спасибо за ссылку, но в примере там только ищет строку, чтобы увидеть, совпадает ли она с регулярным выражением. В моем примере я мог бы использовать «ABC» матчи «^ аб * $» Но разве то, что я пытаюсь достичь, я пытаюсь найти список строк, чтобы увидеть, если любой из них соответствует регулярным выражение. Я не думаю, что это часть регулярного выражения, которая вызывает у меня проблемы. Это факт, что я не знаю, как перебирать список строк в drools. Вы знаете, как я могу это сделать? спасибо – MTH

+0

Я не уверен, но я предполагаю, что вы хотите увидеть, как применить регулярное выражение к списку. «соответствует хотя бы одному», «соответствует одному или нескольким» - это те вещи, которые я бы искал. Если вы не находите петли в Drools, это потому, что это не должно работать так. – duffymo

+0

Знаете ли вы, есть ли способ вставить Java-код в правило? – MTH

3

я использовал эту команду, когда я использовал этот DRL файл как правила для моего проекта

Надежда это может быть полезным для вас.

пакет com.sample

импорт 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 ($vvl.indexOf(String.valueOf(charAt($idx))) >= 0) из $m.stringArray

Таким образом, вы можете вызвать различные функции строки на каждой строке, помещенной в массиве строк.

 Смежные вопросы

  • Нет связанных вопросов^_^