前言
使用jexl替换表达中的字母,使其能够匹配成数字表达式
提示:以下是本篇文章正文内容,下面案例可供参考
一、jexl
使用的是2.1.1版本
二、使用步骤
1.代码:
代码如下(示例):
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description: 将中括号中的字母表达式 替换为相应的数字,并得出整个表达式的结果(true/false)
* @author:
* @createDate: 2021/5/26
* @version: 1.0
*/
public class Demo {
public static void main(String[] args) {
//规则 N 标识本期数,N1 上期数 N2 上上期数
// A001 为任意编码,我这里只是为了从数据库中取已经定义好的对应编码的数值。
// 最后面的 0 1 判断取到的当前数据是否要取绝对值
String splitStr = "[N_A001_0]>[N1_A001_0]&&([N_A001_0]-[N1_A001_1])/[N1_A001_0]>([N1_A001_0]-[N2_A001_0])/[N2_A001_1]>0.1";
//String splitStr = "[N_BS001_0]>[BS001_201812001_0]&&([BS001_201712001_0]-[BS001_201612001_0])/[BS001_201512001_1]>0";
//String splitStr = "A>30&&B>50&&C<10";
List<String> indexList = IndexFormulaUtils.getIndexCode(splitStr);
//所有的code列表
String formula = splitStr.replaceAll("\\[", "").replaceAll("]", "");
JexlContext jc = new MapContext();
//赋值
for (String index : indexList) {
//==========1.获取数据==========================
if ("N".equals(index.split("_")[2])){
jc.set(index, 100);//将字母编码对应的值处理为100
}else if ("N1".equals(index.split("_")[2])){
jc.set(index, 200);//将字母编码对应的值处理为200
}else {
jc.set(index, 300);//将字母编码对应的值处理为300
}
//==========
if ("1".equals(index.split("_")[2])){
//处理绝对值
jc.set(index, new Bigdecimal(-300).abs());
}
}
//格式化公式
Expression expression = new JexlEngine().createExpression(formula);
Object result1 = expression.evaluate(jc);
if (result1 instanceof Boolean) {
System.out.println((boolean) result1);
} else {
System.out.println(false);
}
}
}
class IndexFormulaUtils {
static Pattern p = Pattern.compile("(\\[[^\\]]*\\])");
public static List<String> getIndexCode(String formula) {
List<String> list = new ArrayList<String>();
Matcher m = p.matcher(formula);
while (m.find()) {
list.add(m.group().substring(1, m.group().length() - 1));
}
return list;
}
}
//依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl</artifactId>
<version>2.1.1</version>
</dependency>
总结
表达式可以视情况修改,以满足实际业务需求。