• Java表达式解析器


    Java表达式解析器

    原文链接:https://www.javatt.com/p/43578

    Jeval

    在运行时解析计算静态和动态表达式;支持数学,布尔,字符串,函数表达式;支持大部分的数学和布尔运算符;支持自定义函数;支持嵌套函数;支持解析;支持自定义变量解析器;

    官网:http://jeval.sourceforge.net

    不支持嵌套变量

    jexel

    处理大部分的数学公式和字符串,通过继承接口来实现个人所需的运算;支持自定义变量解析器;该项目一直在更新,最近一次更新是今年十月七号
    wiki:http://code.google.com/p/jexel/w/list
    不支持变量替换

    aviator Aviator

    是直接将表达式编译成Java字节码,交给JVM去执行

    支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(=~)、三元表达式?: ,并且支持操作符的优先级和括号强制优先级;支持函数调用和自定义函数;支持传入变量,支持类似a.b.c的嵌套变量访问;支持数组的访问;支持正则表达式;

    http://www.blogjava.net/killme2008/archive/2010/09/07/331296.html

    依赖两外两个jarcommons-beanutils和commons-logging

    Aviator执行公式实例:

    
    // 导入的类
    // import cn.hutool.core.lang.Console;
    // import com.googlecode.aviator.AviatorEvaluator;
    // import java.util.HashMap;
    // import java.util.Map;
    
    
    public void test() {
         Map<String, Object> dataMap = new HashMap<>();
         dataMap.put("x", 1);
         dataMap.put("y", 2);
         dataMap.put("z", 3);
         String expression = "(x + y) * x + (x + z) * y + 3.9";
         Console.log("{} = {}", expression, AviatorEvaluator.execute(expression, dataMap));
         Console.log("{} = {}", expression, AviatorEvaluator.compile(expression).execute(dataMap));
    }
    
    // 结果:
    // (x + y) * x + (x + z) * y + 3.9 = 14.9
    // (x + y) * x + (x + z) * y + 3.9 = 14.9
    

    arity

    自定义函数及公式

    不支持变量替换

    Jsci

    数学科学计算:包括线性方程组,统计,小波,牛顿力学。

    jar包太多,不支持变量替换

    IKExpressoin

    支持中文变量及函数名;支持基本运算;函数运算;支持自定义函数;

    不支持变量嵌套

    JSEL

    兼容 JavaScript 运算规则的简单的表达式解释引擎,可以通过Map接口,或者JavaBean给出一个变量集合,能后通过表达式从这个集合中抽取变量,再通过表达式逻辑生成你需要的数据;支持函数扩展,操作符别名定义,操作符定义

    不支持变量嵌套

    jep

    支持大量的数学运算;其他功能都差不多;支持变量嵌套(顺序执行)

    wiki:http://www.singularsys.com/jep/doc/html/variables.html  

    beanshell

    基本运算;变量、函数自定义;支持变量嵌套(顺序执行)  

    Fel

    支持中文变量;支持基本运算;函数运算;支持自定义函数;可调用java方法; 不支持变量嵌套

    在实际项目开发中如果需要解析数学公式,无须再运用解释器模式进行设计,可以直接使用一些第三方解析工具包,它们可以统称为数学表达式解析器(Math Expression Parser, MEP),如Expression4J、Jep、JbcParser、Symja、Math Expression String Parser(MESP)等来取代解释器模式,它们可以方便地解释一些较为复杂的文法,功能强大,且使用简单,效率较好。

    两个常用的基于Java语言的第三方解析工具包:

    Expression4J

    Expression4J是一个基于Java的开源框架,它用于对数学表达式进行操作,是一个数学公式解析器,在Expression4J中可以将数学表达式存储在字符串对象中,如“f(x,b)=2x-cos(b)”和“g(x,y)=f(y,x)-2”等。
    Expression4J是高度定制的,用户可以自定义文法,其主要功能包括实数和复数的基本数学运算,支持基本数学函数(如sin、cos等函数)、复杂函数(如f(x)=2x+5、g(x)=3f(x+2)-x等)以及用户使用Java语言自定义的函数和文法,还可以定义函数目录(函数集)、支持XML配置文件等。
    目前它还不是一个十分成熟的框架,仍在不断完善中。
    关于Expression4J的更多资料可以参考网站:http://sourceforge.net/projects/expression4j/?source=directory

    Jep

    Jep(JavaMathematical Expression Parser)是一个用于解析和求解数学表达式的Java类库。
    通过使用Jep提供的包,我们可以输入一个以字符串表示的任意数学公式,然后立即对其进行 求解。
    Jep支持用户自定义变量、常量和自定义函数,同时还包含了大量通用的数学函数和常量。
    关于Jep的更多资料可以参考网

  • 相关阅读:
    求最大公约数和最小公倍数,从文件输入数据,将结果输出到另外一个文件
    在CentOS系统中安装quota来管理磁盘配额
    The implementation details of the built thermal setup
    Task set generation
    利用FPGA加速实现高性能计算
    跨域名上传图片
    这几天基本是混过来的
    jQuery插件之Cookie
    jQuery on()方法
    CActiveForm提示中文化
  • 原文地址:https://www.cnblogs.com/annamaple/p/16308862.html
Copyright © 2020-2023  润新知