2012-08-14 106 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

    致以問候