当前位置: 首页 > news >正文

【表达式】JAVA解析数学表达式 parsii 计算数学公式 表达式规则引擎 动态脚本语言

【表达式】JAVA解析数学表达式 parsii 计算数学公式 表达式规则引擎 动态脚本语言

1 MAVEN依赖

<!-- https://mvnrepository.com/artifact/com.scireum/parsii --> <dependency> <groupId>com.scireum</groupId> <artifactId>parsii</artifactId> <version>4.0</version> </dependency>

或者使用 BigDecimal版本

<!-- https://mvnrepository.com/artifact/com.mpobjects/bdparsii --> <dependency> <groupId>com.mpobjects</groupId> <artifactId>bdparsii</artifactId> <version>1.0.0</version> </dependency>

2 DEMO

String exp = "2 + (7-5) * 3.14159 * x + sin(0)"; // compile Scope scope = Scope.create(); Expression parsiiExpr = Parser.parse(exp); Variable var = scope.getVariable("x"); var.setValue(X_VALUE); // evaluate double result = parsiiExpr.evaluate(); //OR //BigDecimal result = parsiiExpr.evaluate(); System.out.println(result);//-> 2.0

计算工具 支持%等

import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReUtil; import com.guanwei.study.string.CharUtil; import com.mpobjects.bdparsii.eval.Expression; import com.mpobjects.bdparsii.eval.Parser; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; public class ParsiiDemo { public static void main(String[] args) throws Exception { // String exp = "2 + (7-5) * 3.14159 * x + sin(0)"; String exp = "e^0.4*sign(3/12)"; exp = "((1+2 - 0) × 100 +( 2X1)-2 ) ÷2 * 50.5% * 20% + {1-2} + [1+5] ﹣1·1 /1 ﹢1 ﹣1"; // String exp = "e^0.4*√(3/12)"; System.out.println("之前:" + exp); exp = ParsiiDemo.transitionFormula(exp); System.out.println("之后:" + exp); // compile // Scope scope = new Scope(); Expression parsiiExpr = Parser.parse(exp); // Variable var = scope.getVariable("x"); // var.setValue(0); // evaluate BigDecimal result = parsiiExpr.evaluate(); System.out.println("计算结果:" + result);//-> 2.0 } public static String transitionFormula(String exp){ // exp = "+"; //全角转半角 exp = CharUtil.toDbc(exp); //所有字符转为小写 exp = exp.toLowerCase(); exp = exp .replaceAll("﹢", "+") .replaceAll("十", "+") .replaceAll("┼", "+") .replaceAll("╋", "+") .replaceAll("╬", "+") .replaceAll("﹣", "-") .replaceAll("一", "-") .replaceAll("x", "*") .replaceAll("×", "*") .replaceAll("╳", "*") .replaceAll("х", "*") .replaceAll("·", "*") .replaceAll("÷", "/") .replaceAll("\\{", "(") .replaceAll("}", ")") .replaceAll("\\[", "(") .replaceAll("]", ")") ; //包含百分号 if(exp.contains("%")){ //获取包含百分号的数字 //List<String> resultFindAll = ReUtil.findAll("([\\d])*%|([\\d]).([\\d])*%", exp, 0, new ArrayList<String>()); List<String> resultFindAll = ReUtil.findAll("([\\\\d])*%|(\\\\d{1,10}).([\\\\d])*%", exp, 0, new ArrayList<String>()); if(CollUtil.isNotEmpty(resultFindAll)){ for (String s : resultFindAll) { s = s.trim(); String replace = s.replace("%", ""); BigDecimal bigDecimal = new BigDecimal(replace); bigDecimal = bigDecimal.divide(new BigDecimal(100)); exp = exp.replaceAll(s, bigDecimal.toString()); } } System.out.println(resultFindAll); } return exp; } }

补充全角转半角的工具

CharUtil

import cn.hutool.core.util.StrUtil; /** * 字符工具 */ public class CharUtil { /** * 半角转全角的函数(SBC case) * 全角空格为12288,半角空格为32,其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 * * @param input 任意字符串 * @return 全角字符串 */ public static String toSbc(String input) { if (StrUtil.isBlank(input)) { return ""; } char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 32) { c[i] = (char) 12288; continue; } if (c[i] < 127) { c[i] = (char) (c[i] + 65248); } } return new String(c); } /** * 全角转半角的函数(DBC case) * 全角空格为12288,半角空格为32 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 * * @param input 任意字符串 * @return 半角字符串 */ public static String toDbc(String input) { if (StrUtil.isBlank(input)) { return ""; } char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 12288) { c[i] = (char) 32; continue; } if (c[i] > 65280 && c[i] < 65375) { c[i] = (char) (c[i] - 65248); } } return new String(c); } /** * 打印出java中所有Unicode编码的字符 */ private static void printAllCharacter() { for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) { System.out.println(i + " " + (char) i); } } public static void main(String[] args) { String str = "半角符号示例:,!~ 全角符号示例:,!~"; System.out.println("半角--->全角转换前:" + str); String sbcResult = toSbc(str); System.out.println("半角--->全角转换后:" + sbcResult); System.out.println("全角--->半角转换前:" + str); String dbcResult = toDbc(str); System.out.println("全角--->半角转换后:" + dbcResult); //打印出java所有字符 // printAllCharacter(); } }

其他

QLExpress: 规则引擎 (gitee.com)

GitHub - alibaba/QLExpress: QLExpress is a powerful, lightweight, dynamic language for the Java platform aimed at improving developers’ productivity in different business scenes.

添加依赖

<dependency> <groupId>com.alibaba</groupId> <artifactId>QLExpress</artifactId> <version>3.2.7</version> </dependency>

代码

ExpressRunner runner = new ExpressRunner(); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("a",1); context.put("b",2); context.put("c",3); String express = "a+b*c+3"; Object r = runner.execute(express, context, null, true, false); System.out.println(r);

JEval

依赖

<!-- https://mvnrepository.com/artifact/net.sourceforge.jeval/jeval --> <dependency> <groupId>net.sourceforge.jeval</groupId> <artifactId>jeval</artifactId> <version>0.9.4</version> </dependency>

代码

String exp = "2 + (7-5) * 3.14159 * #{x} + sin(0)"; // compile Evaluator jevalEvaluator = new Evaluator(); jevalEvaluator.setVariables(Collections.singletonMap("x", Double.toString(X_VALUE))); // evaluate double result = Double.parseDouble(jevalEvaluator.evaluate(exp)); System.out.println(result);//-> 2.0

JEPLite

String exp = "2 + (7-5) * 3.14159 * x + sin(0)"; // compile JEP jep = new JEP(); jep.addVariable("x", X_VALUE); jep.parseExpression(exp); DoubleStack jepStack = new DoubleStack(); // evaluate double result = jep.getValue(jepStack); System.out.println(result);//-> 2.0

parsii

JEval

JEPLite

expr

Janino

MathEval

QLExpress

alibaba/QLExpress: QLExpress is a powerful, lightweight, dynamic language for the Java platform aimed at improving developers’ productivity in different business scenes. (github.com)

alibaba/QLExpress

QLExpress是一种功能强大、轻量级的Java平台动态语言,旨在提高开发人员在不同业务场景中的生产力。

由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。

QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:

  • 1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。
  • 2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。
  • 3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。
  • 4、安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
  • 5、代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。

groovy

Groovy 教程_w3cschool

Apache Groovy是一种强大的、可选的类型化和动态语言,具有静态类型和静态编译功能,用于Java平台,目的在于通过简洁、熟悉和易于学习的语法提高开发人员的工作效率。它可以与任何Java程序顺利集成,并立即向您的应用程序提供强大的功能,包括脚本编写功能、特定于域的语言编写、运行时和编译时元编程以及函数式编程。
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。也是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程

流程规则引擎

dromara / liteFlow

轻量,快速,稳定,可编排的组件式规则引擎/流程引擎。 拥有全新设计的DSL规则表达式。 组件复用,同步/异步编排,动态编排,复杂嵌套规则,热部署,平滑刷新规则等等功能,让你加快开发效率!

http://www.jsqmd.com/news/881272/

相关文章:

  • 鬼泣5附历代合集(内附绅士mod)2026最新官方正版免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)
  • FCEUX终极指南:如何用NES模拟器重温经典并深入调试
  • ARM SME架构下BFloat16矩阵运算优化实践
  • Unity 2022+ 接入Tap广告联盟SDK避坑指南:从Gradle配置到实机测试全流程
  • 电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记
  • 从安装到精通:BetterTweetDeck完整使用手册(2023最新版)
  • 网盘下载加速神器LinkSwift:告别龟速下载的5分钟完整指南
  • vczh_toys Linq库进阶:复杂数据处理的8个实用案例指南
  • 别再等电池报废!用Python+Sklearn,仅需100次循环数据就能预测电池寿命(附完整代码)
  • ComfyUI终极UI增强指南:7个免费工具让你的AI绘画效率翻倍
  • 可视化数据集构建指南:从概念到实践,驱动图表智能生成与理解
  • gcvis高级功能:自定义图表、数据导出与API集成终极指南
  • wolkenkit数据存储配置:PostgreSQL、MySQL、MongoDB实战指南
  • Unity 2022 LTS + Photon Fusion 2:手把手教你搭建第一个多人联机Demo(含完整代码)
  • 时间序列预测实战:从LightGBM到GNN与强化学习的算法选型指南
  • 海尔智能家居设备接入HomeAssistant:打造一体化智能家居控制中心
  • 机器学习解码结直肠癌基因协同作用:从WNT通路到联合治疗新靶点
  • 2026年4月头部火锅品牌推荐,地摊火锅/重庆火锅/成都火锅/社区火锅/牛肉火锅/美食/附近火锅,火锅品牌推荐 - 品牌推荐师
  • 如何为Tesla-Menu添加自定义覆盖?终极开发者入门指南
  • 融合物理与AI:基于DtN映射与FEM的椭圆型PDE反问题自监督求解框架
  • 告别音乐平台切换:开源音源聚合方案如何重塑你的听歌体验
  • 从零构建智能对话工作流:SillyTavern脚本系统的深度应用指南
  • JoyCon-Driver 多控制器管理:同时连接4个 JoyCons 的配置指南
  • Unity Android构建报错SDK version is 0的根因与精准修复
  • 2026年4月市面上靠谱的udb测试直销厂家推荐,疲劳曲线测试/压铸件模流分析,udb测试直销厂家推荐 - 品牌推荐师
  • ImageSearch部署指南:从开发环境到生产环境的完整迁移策略
  • OpenPilot深度部署指南:从架构解析到生产级调优
  • G-Helper终极指南:华硕笔记本轻量控制神器,告别Armoury Crate臃肿
  • Forge中的上下文压缩:处理长对话的高效方法
  • Linux服务器升级OpenSSL 3.2.0后,为什么我的curl命令不能用了?一个软链接引发的‘血案’