2012-08-14 112 views
6

我正在寻找一个JAVA库来解析&评估表达式。我搜索并尝试了一些像Apache的JEXL和Jeval这样的库,但它们并不是我所需要的。JAVA - 表达式解析和评估库

我的要求:

  1. 支持所有的值类型(即INT,双,布尔,字符串等)
  2. 支持所有已知的数学&逻辑运算符(+, - ,*,<,< =等)
  3. 支持变量(没有任何特殊符号 - 例如在Jeval变量a中应该写成#{a} - 对我来说不够好)
  4. 支持自定义函数 - 带有类型执行和验证

有什么建议吗?

+1

您是否考虑过内置的Java脚本引擎? – EJP 2012-08-14 07:23:37

回答

0

这里是一对夫妇的解决方法的解决方案,你可以选择,如果你没有找到一个实际的Java表达式求值库:

  • 使用XPath评估你的表情。
    • 优点:知道的XPath逻辑运算符,并且可以实现使用Xalan的扩展
    • 缺点变量和自定义函数:XPath的不是Java
    • 具有更少种类的
  • 评估使用JavaScript你的表情。
    • 优点:Javascript非常灵活,并且在您的需求变紧时仍然适用。您可以实现使用Javascript以及
    • 缺点变量和自定义功能:使用Javascript比Java
    • 具有更少种类的
  • 使用JSP表达式语言(例如用JUEL
3

像建议评估你的表情,你可以使用JavaScript。但你也可以看看Spring EL,它支持你的要求。

5

尝试Janino。它是一个运行时内存中编译器,可用作表达式计算器。也许这对你来说是正确的。

+0

这真是一个令人印象深刻的图书馆,至少从他们声称能够做到的 – 2012-08-14 07:35:23

1

你可以尝试mXparser - 它支持您的需求显著部分:

  1. 它是基于双,所以INT支持,另外布尔支持为真= 1,假= 0。不幸的是字符串不受支持。

布尔例如:

import org.mariuszgromada.math.mxparser.*; 
... 
... 
Constant T = new Constant("T = 1"); 
Constant F = new Constant("F = 0"); 
Expression e = new Expression("T && (F || (F && T))", T, F); 
System.out.println(e.getExpressionString() + " = " + e.calculate()); 

结果:

T && (F || (F && T)) = 0.0 
  • mXparser已为运营商的广泛支持,函数等。检查mXparser math collection 。什么是好的,你可以使用库中的帮助功能。
  • 实施例:

    import org.mariuszgromada.math.mxparser.*; 
    ... 
    ... 
    mXparser.consolePrintHelp("operator"); 
    

    结果:

    Help content: 
    
        2. +     <Operator>    addition 
        3. -     <Operator>    subtraction 
        4. *     <Operator>    multiplication 
        5./     <Operator>    division 
        6.^     <Operator>    exponentiation 
        7. !     <Operator>    factorial 
        8. #     <Operator>    modulo function 
        9. &     <Boolean Operator>  logical conjunction (AND) 
        10. &&     <Boolean Operator>  logical conjunction (AND) 
        11. /\     <Boolean Operator>  logical conjunction (AND) 
        12. ~&     <Boolean Operator>  NAND - Sheffer stroke 
        13. ~&&     <Boolean Operator>  NAND - Sheffer stroke 
        14. ~/\     <Boolean Operator>  NAND - Sheffer stroke 
        15. |     <Boolean Operator>  logical disjunction (OR) 
        16. ||     <Boolean Operator>  logical disjunction (OR) 
        17. \/     <Boolean Operator>  logical disjunction (OR) 
        18. ~|     <Boolean Operator>  logical NOR 
        19. ~||     <Boolean Operator>  logical NOR 
        20. ~\/     <Boolean Operator>  logical NOR 
        21. (+)     <Boolean Operator>  exclusive or (XOR) 
        22. -->     <Boolean Operator>  implication (IMP) 
        23. <--     <Boolean Operator>  converse implication (CIMP) 
        24. -/>     <Boolean Operator>  material nonimplication (NIMP) 
        25. </-     <Boolean Operator>  converse nonimplication (CNIMP) 
        26. <->     <Boolean Operator>  logical biconditional (EQV) 
        27. ~     <Boolean Operator>  negation 
        28. ¬     <Boolean Operator>  negation 
        162. add     <Variadic Function>  (2.4) Summation operator add(a1,a2,a3,...,an) 
        168. sum     <Calculus Operator>  summation operator (SIGMA) sum(i, from, to, f(i,...)) 
        169. prod    <Calculus Operator>  product operator (PI) prod(i, from, to, f(i,...)) 
        170. int     <Calculus Operator>  definite integral operator (int(f(x,...), x, a, b)) 
        171. der     <Calculus Operator>  derivative operator (der(f(x,...), x)) 
        172. der-    <Calculus Operator>  left derivative operator (der-(f(x,...), x)) 
        173. der+    <Calculus Operator>  right derivative operator (der+(f(x,...), x)) 
        174. dern    <Calculus Operator>  n-th derivative operator (dern(f(x,...), x)) 
        175. diff    <Calculus Operator>  forward difference operator 
        176. difb    <Calculus Operator>  backward difference operator 
        177. avg     <Calculus Operator>  (2.4) Average operator avg(i, from, to, f(i,...)) 
        178. vari    <Calculus Operator>  (2.4) Bias-corrected sample variance operator vari(i, from, to, f(i,...)) 
        179. stdi    <Calculus Operator>  (2.4) Bias-corrected sample standard deviation operator stdi(i, from, to, f(i,...)) 
        180. mini    <Calculus Operator>  (2.4) Minimum value mini(i, from, to, f(i,...)) 
        181. maxi    <Calculus Operator>  (2.4) Maximum value maxi(i, from, to, f(i,...)) 
        182. solve    <Calculus Operator>  (4.0) f(x) = 0 equation solving, function root finding: solve(f(x,...), x, a, b) 
        301. @~     <Bitwise Operator>  (4.0) Bitwise unary complement 
        302. @&     <Bitwise Operator>  (4.0) Bitwise AND 
        303. @^     <Bitwise Operator>  (4.0) Bitwise exclusive OR 
        304. @|     <Bitwise Operator>  (4.0) Bitwise inclusive OR 
        305. @<<     <Bitwise Operator>  (4.0) Signed left shift 
        306. @>>     <Bitwise Operator>  (4.0) Signed right shift 
    
  • 用户定义的变量和都没有任何特殊的形式创建用户定义的常量。
  • 实施例:

    import org.mariuszgromada.math.mxparser.*; 
    ... 
    ... 
    Argument x = new Argument("x = 10"); 
    Constant y = new Constant("y = 2"); 
    Expression e = new Expression("x/y", x, y); 
    System.out.println(e.getExpressionString() + " = " + e.calculate()); 
    

    结果:

    x/y = 5.0 
    

    另外请检查:a)Tutorial - User defined arguments,B)Tutorial - User defined constants

    1. 完全支持用户定义的功能

    实施例1 - 在运行时定义体: - :

    import org.mariuszgromada.math.mxparser.*; 
    ... 
    ... 
    /* 
    * Implementing FunctionExtension interface 
    */ 
    public class Addition implements FunctionExtension { 
        double x; 
        double y; 
        public Addition() { 
         x = Double.NaN; 
         y = Double.NaN; 
        } 
        public Addition(double x, double y) { 
         this.x = x; 
         this.y = y; 
        } 
        public int getParametersNumber() { 
         return 2; 
        } 
        public void setParameterValue(int argumentIndex, double argumentValue) { 
         if (argumentIndex == 0) x = argumentValue; 
         if (argumentIndex == 1) y = argumentValue; 
        } 
        public double calculate(double... params) { 
         return x+y; 
        } 
        public FunctionExtension clone() { 
         return new Addition(x, y); 
        } 
    } 
    
    /* 
    * Creating extended function 
    */ 
    Function f = new Function("f", new Addition()); 
    mXparser.consolePrintln("f.calculate(1,2) = " + f.calculate(1,2)); 
    /* 
    * Using extended function in expression 
    */ 
    Expression e = new Expression("f(2,3)", f); 
    System.out.println(e.getExpressionString() + " = " + e.calculate()); 
    

    结果

    import org.mariuszgromada.math.mxparser.*; 
    ... 
    ... 
    Function f = new Function("f(x,y) = x*y"); 
    Expression e = new Expression("20-f(2,5)",f); 
    System.out.println(e.getExpressionString() + " = " + e.calculate()); 
    

    结果1对

    20-f(2,5) = 10.0 
    

    实施例2体经由自己的实现延长2:

    f.calculate(1,2) = 3.0 
    f(2,3) = 5.0 
    

    另外值得关注整个mXparser Tutorial

    致以问候