Java中的布尔表达式评估

我正在寻找一种相对简单(与编写解析器相比)的方法来评估Java中的布尔表达式,我不想使用JEP库。

我有一个String表达式,如: (x > 4 || x 6) ,我的目标是用值替换变量。

有没有办法评估这个表达式?

请记住,这可能是任何级别的深度,因此编写解析器将非常复杂。

您可以在Java6中使用脚本引擎,并选择任何流行的脚本语言,如Scala , Ruby , Python , Groovy和Javascript 。 您所要做的就是确保要评估的表达式使用正确的语言。 Groovy可能是最简单的,并且将最好地集成。

我已经成功地使用这种方法来提供function,就像流行的电子表格应用程序中的公式/计算列一样。

使用Apache Commons Jexl; 这正是为这种要求而设计的。

http://commons.apache.org/jexl/

使用jexl( http://commons.apache.org/jexl/ ),您可以像这样完成此操作

  JexlEngine jexl = new JexlEngine(); jexl.setSilent(true); jexl.setLenient(true); Expression expression = jexl.createExpression("(a || b && (c && d))"); JexlContext jexlContext = new MapContext(); //b and c and d should pass jexlContext.set("b",true); jexlContext.set("c",true); jexlContext.set("d",true); assertTrue((Boolean)expression.evaluate(jexlContext)); jexlContext = new MapContext(); //b and c and NOT d should be false jexlContext.set("b",true); jexlContext.set("c",true); //note this works without setting d to false on the context //because null evaluates to false assertFalse((Boolean)expression.evaluate(jexlContext)); 

以下是表达式评估框架的最新资源

信息页面位于http://expressionoasis.vedantatree.com/

JUEL提供了Java的统一表达式语言的实现,而没有明确地与JSP相关联。 这是它的快速入门指南 ,表达式评估(该页面上的#3)是您感兴趣的部分。

或者, Spring 3.0提供了自己的(虽然有些类似)表达式语言。 这个选项只有在你已经使用Spring的情况下才有意义 – 我不会仅仅为EL提供它。

尝试使用http://code.google.com/p/xpressionengine/进行开源实施

我发现这里列出的库太复杂了我的需求。 我最终使用了Fscript: http ://fscript.sourceforge.net/

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() ); 

尝试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); 

你可以尝试这个库https://github.com/Shy-Ta/expression-evaluator-demo-阅读我有很多例子。 该库使用java和groovy。

除了支持这个用例外,它还支持许多其他类似excel的function。 此外,添加新function非常简单,如示例中所示。

  ExpressionsEvaluator evalExpr = ExpressionsFactory.create("(x > 4 || x < 8 && p > 6)"); Map variables = new HashMap(); variables.put("x", 100); variables.put("p", 10); evalExpr.eval();