当前位置: 首页 > 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.cnnetsun.cn/news/2549987.html

相关文章:

  • vue-axios-github解密:5分钟理解axios拦截器实现请求/响应统一处理
  • 如何快速部署PostgreSQL数据建模工具:跨平台完整安装教程
  • 戴森球计划FactoryBluePrints:构建星际工厂的终极蓝图库
  • 零基础也能创作视觉小说:WebGAL引擎3分钟快速上手指南
  • FIFA 23生涯模式终极修改指南:免费开源工具打造完美足球世界
  • MPC Video Renderer:开源视频渲染器的完整安装与配置终极指南
  • 告别杂乱!用FileMenu Tools 8.4.2一键清理Windows 11右键菜单,附赠我的常用命令清单
  • WinFsp深度解析:如何在Windows上轻松构建用户空间文件系统
  • 如何高效使用Python SoundCloud下载器:打造个人音乐库的完整指南
  • NexoPOS用户指南:从小白到专家的10个实用技巧
  • 5分钟上手!Linux用户必备的Apple Emoji字体安装教程
  • JWT令牌机制完全指南
  • Keil MDK优化级别设置与嵌入式开发性能调优
  • ViVeTool-GUI专业指南:解锁Windows隐藏功能的智能方案
  • 别再踩坑了!Ubuntu 22.04 上编译 Mbedtls 3.6 的完整避坑指南(附 Python 依赖解决)
  • 告别虚拟机!保姆级教程:在Win11上用WSL2+Ubuntu 22.04跑起你的第一个Linux桌面
  • 《Java 100 天进阶之路》第12篇:Java对象、类、抽象类、构造方法
  • 机器学习数据集详解,公开免费数据集获取渠道汇总
  • 从零构建通用关系数据库系统:总体设计方案
  • 2026电工杯数学建模竞赛A题论文、代码、数据(改进)
  • 2026保姆级免费去图片水印教程,这4款微信小程序一键搞定
  • VMware虚拟机里装FydeOS,给旧电脑或MacBook找个轻量‘副系统’
  • Unity新手村:用Terrain工具5分钟搭出你的第一个3D场景(含环境包导入)
  • 从HaGRID到自定义:手部关键点数据集标注、转换与可视化实战(Python代码)
  • 别再乱改lightdm.conf了!深入理解LightDM钩子脚本,精准控制Arctica-greeter显示缩放
  • Unity UI Toolkit避坑指南:3D世界UI、动画与Shader,这些事它真做不了
  • 告别虚拟机!手把手教你用U盘给新电脑装Win11+统信UOS双系统(保姆级分区教程)
  • GCN vs MLP:在Cora数据集上,图神经网络到底强在哪?(附可视化对比)
  • 极验4滑块验证码纯算实现:WASM逆向与AES-HMAC算法复现
  • Prompt设计黄金公式首次公开,从“为什么鸡过马路”到“量子态薛定谔猫谜题”,10分钟定制专属脑力挑战库,限前500名领取模板包