2010-07-31 31 views
7

¿Alguien sabe si hay una manera de hacer los lazos en babas?son para bucles posibles en babas?

Estoy tratando de recorrer una lista de cadenas para ver si una de las cadenas coincide con un patrón, p.

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

for(String s:listOfStrings){ 
if(s matches "^a.b.*$"){ 
return true 
} 
} 

he escrito la siguiente regla basada en lo que la documentación que pude encontrar, pero no creo que la sintaxis es correcta

rule "Matcher" 
    when 
     TestClass : TestClass(($s matches "^a.b.*$") from listOfStrings, count($s)) 
    then 
     TestClass.setResponse("Condition is True !!"); 
end 

Me resulta difícil encontrar una buena documentación en el idioma del drl

Le agradecería cualquier ayuda que nadie me puede dar


Basado en la respuesta anterior, he intentado el siguiente

rule "Matcher" 
    when 
TestClass:TestClass(String(this matches "^a.b.*$") from listOfStrings) 
then 
     TestClass.setResponse("Condition is True !!"); 
end 

Sin embargo, ahora me sale el siguiente mensaje de error:

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

Respuesta

12

Creo que ha entendido mal los fundamentos de un motor de reglas; necesitas pensar un poco diferente.

En lugar de 'iterar' sobre la lista, debe dividir la lista en sus cadenas de componentes e insertarlas individualmente como hechos en la memoria de trabajo.

Solo las cadenas/hechos que coincidan con la condición 'cuándo' dispararán la regla.

Es posible que también desee buscar en globales y consultas. global le permitirá inyectar un servicio en su memoria de trabajo para que las consecuencias lo llamen, y la consulta podría ser una forma de obtener las cadenas coincidentes de la memoria de trabajo.

2

El algoritmo Rete no funciona de esta manera.

Creo que quieres probar regex in Drools.

+0

Gracias por el enlace, pero el ejemplo solo busca una cadena para ver si coincide con una expresión regular. En mi ejemplo que podría utilizar partidos "abc" "ab^* $" Pero eso isnt lo que estoy tratando de lograr, estoy tratando de buscar una lista de cadenas para ver si alguno de ellos coinciden con un habitual expresión. No creo que sea la parte de la expresión regular la que me esté causando problemas. Es el hecho de que no sé cómo iterar a través de una lista de cadenas en drools. ¿Sabes cómo podría hacer esto? gracias – MTH

+0

No estoy seguro, pero supongo que quiere ver cómo aplicar la expresión regular a una lista. "coincide con al menos uno", "coincide con uno o más" son los tipos de cosas que estaría buscando. Si no encuentra bucles en Drools, es porque no debería funcionar de esa manera. – duffymo

+0

¿sabes si hay una forma de insertar código Java en una regla? – MTH

3

que había utilizado este comando cuando utilicé este archivo drl como reglas para mi proyecto

la esperanza que esto puede ser útil para usted.

paquete com.sample

com.sample importación.HelloProcessModel;

regla "NYuser_Rule"

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

final

regla "ChileUser_Rule"

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

final

regla "BelgiumUser_Rule"

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

final

0

También estoy interactuando sobre la String[] y el uso de estas funciones de cadena en cada cadena de la cadena []. Esto es lo que estoy utilizando ...

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

Así que usted puede llamar a diferentes funciones de cadena en cada cadena se coloca en cadena de su matriz.

Cuestiones relacionadas