package com.finance.common.utils; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.jexl3.JexlBuilder; import org.apache.commons.jexl3.JexlContext; import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.JexlExpression; import org.apache.commons.jexl3.MapContext; /** * @author mitao * @date 2024/3/27 */ public class CalculateUtil { public static Map getFieldsAndValue(String rule) { // 正则表达式模式,匹配形如 "fieldName:value" 的字符串 Pattern pattern = Pattern.compile("\\b(\\w+)_(\\d+)\\b"); Matcher matcher = pattern.matcher(rule); Map map = new HashMap<>(); // 循环匹配并输出字段名和值 while (matcher.find()) { String fieldName = matcher.group(1); int value = Integer.parseInt(matcher.group(2)); map.put(fieldName + "_" + value, value); } return map; } public static double calculate(String expression, Map value) { expression = formatExpression(expression); // 创建 JEXL 引擎 JexlEngine jexl = new JexlBuilder().create(); // 创建表达式对象 JexlExpression exp = jexl.createExpression(expression); // 创建上下文 JexlContext context = new MapContext(); for (Map.Entry stringObjectEntry : value.entrySet()) { context.set(stringObjectEntry.getKey(), stringObjectEntry.getValue()); } // 执行计算 Object result = exp.evaluate(context); // 输出结果 System.out.println("Result: " + result); return Double.parseDouble(result.toString()); } public static double calculate(String expression) { // 创建 JEXL 引擎 JexlEngine jexl = new JexlBuilder().create(); // 创建表达式对象 JexlExpression exp = jexl.createExpression(expression); // 创建上下文 JexlContext context = new MapContext(); // 执行计算 Object result = exp.evaluate(context); // 输出结果 System.out.println("Result: " + result); return Double.parseDouble(result.toString()); } public static String formatExpression(String expression) { return expression .replaceAll("×", "*") .replaceAll("÷", "/") .replaceAll("(", "(") .replaceAll(")", ")") .replaceAll("+", "+") .replaceAll("-", "-"); } public static void main(String[] args) { String string = "field_3 * field_2"; System.out.println(getFieldsAndValue(string)); } }