需求:使用jexl3动态表达式来构建规则引擎,当遇到复杂逻辑时,需要自定义函数来扩展其功能。
场景介绍:我是在一个实时引擎里使用,收到一条MQ,我会根据配置的规则来取值或者判断是否符合条件,这时候需求要用到正则表达式,所以需要扩展jexl3。
直接看实现:
1、首先要自定义类和方法
public class UserFunction {
/**
*
* @param regex 正则表达式,配置的时候提供
* @param input 输入字符,这个是动态传入的,我配置的时候只配置字段名
* @return
*/
public static int regexp(String regex, String input){
int len = 0;
if(Tookit.isEmpty(regex) || Tookit.isEmpty(input)){
return len;
}
try {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while(matcher.find()){
len++;
}
}catch (Exception e){
log.error("regexp error.{}", e.getMessage());
return 0;
}
return len;
}
}
2、调用
JexlEngine jexl = new JexlBuilder().create();
JexlContext jc = new MapContext();
jc.set("rule", new UserFunction() );
jc.set("input","exy123z,xy456z,1232,axy456z");
//这里是配置,根据配置来调用表达式 我们可以看到第一个参数是配置的时候传进去的,而第二个参数呢是动态变量
String express = "rule.regexp('(x)(y\\w*)(z)', input) > 0";
JexlScript expr = jexl.createScript(express);
System.out.println(expr.execute(jc));
//结果是true
相应的可以实现其他任何的自定义函数
网友评论