我正在寻找一种比较简单(与编写解析器相比)的方法来评估Java中的布尔表达式,我不想使用JEP库。
我有一个String表达式,如:(x > 4 || x < 8 && p > 6)
,我的目标是用值替换变量。
有没有办法评估这个表达式?
请记住,这可能是任何级别,因此编写解析器会非常复杂。
答案 0 :(得分:14)
使用Apache Commons Jexl;这正是为这种要求而设计的。
答案 1 :(得分:6)
您可以使用Java6中的脚本引擎,并选择任何流行的脚本语言,例如Scala,Ruby,Python,Groovy和Javascript。您所要做的就是确保要评估的表达式使用正确的语言。 Groovy可能是最简单的,并且会整合得最好。
我已成功使用此方法提供功能,就像流行的电子表格应用程序中的公式/计算列一样。
答案 2 :(得分:1)
以下是表达式评估框架的最新资源
答案 3 :(得分:0)
JUEL提供了Java的统一表达式语言的实现,而没有明确地与JSP相关联。这是它的Quick Start guide,表达式评估(该页面上的#3)是您感兴趣的部分。
或者,Spring 3.0提供了自己的(虽然有些类似)表达式语言。这个选项只有在你已经使用Spring的情况下才有意义 - 我不会仅仅为了EL而使用它。
答案 4 :(得分:0)
http://lts.online.fr/dev/java/math.evaluator/
有一个API示例:
MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println( m.getValue() );
答案 5 :(得分:0)
答案 6 :(得分:0)
我发现这里列出的库太复杂了我的需求。我最终使用Fscript: http://fscript.sourceforge.net/
答案 7 :(得分:0)
尝试Janino http://docs.codehaus.org/display/JANINO/Home 使用起来非常简单(取自http://docs.codehaus.org/display/JANINO/Basic):
// Compile the expression once; relatively slow.
ExpressionEvaluator ee = new ExpressionEvaluator(
"c > d ? c : d", // expression
int.class, // expressionType
new String[] { "c", "d" }, // parameterNames
new Class[] { int.class, int.class } // parameterTypes
);
// Evaluate it with varying parameter values; very fast.
Integer res = (Integer) ee.evaluate(
new Object[] { // parameterValues
new Integer(10),
new Integer(11),
}
);
System.out.println("res = " + res);
答案 8 :(得分:0)
你可以试试这个图书馆https://github.com/Shy-Ta/expression-evaluator-demo - 读我有很多例子。该库使用java和groovy。
除了支持这个用例外,它还支持许多其他类似excel的功能。此外,添加新功能非常简单,如示例中所示。
ExpressionsEvaluator evalExpr = ExpressionsFactory.create("(x > 4 || x < 8 && p > 6)");
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("x", 100);
variables.put("p", 10);
evalExpr.eval();