我正在尋找一個JAVA庫來解析&評估表達式。我搜索並嘗試了一些像Apache的JEXL和Jeval這樣的庫,但它們並不是我所需要的。JAVA - 表達式解析和評估庫
我的要求:
- 支持所有的值類型(即INT,雙,布爾,字符串等)
- 支持所有已知的數學&邏輯運算符(+, - ,*,<,< =等)
- 支持變量(沒有任何特殊符號 - 例如在Jeval變量a中應該寫成#{a} - 對我來說不夠好)
- 支持自定義函數 - 帶有類型執行和驗證
有什麼建議嗎?
我正在尋找一個JAVA庫來解析&評估表達式。我搜索並嘗試了一些像Apache的JEXL和Jeval這樣的庫,但它們並不是我所需要的。JAVA - 表達式解析和評估庫
我的要求:
有什麼建議嗎?
這裏是一對夫婦的解決方法的解決方案,你可以選擇,如果你沒有找到一個實際的Java表達式求值庫:
像建議評估你的表情,你可以使用JavaScript。但你也可以看看Spring EL,它支持你的要求。
你可以嘗試mXparser - 它支持您的需求顯著部分:
布爾例如:
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
實施例:
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 - 在運行時定義體: - :
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。
致以問候
您是否考慮過內置的Java腳本引擎? – EJP 2012-08-14 07:23:37