Java中的布尔表达式评估

时间:2009-11-15 05:26:55

标签: java boolean expression evaluate

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

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

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

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

9 个答案:

答案 0 :(得分:14)

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

  

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

答案 1 :(得分:6)

您可以使用Java6中的脚本引擎,并选择任何流行的脚本语言,例如ScalaRubyPythonGroovyJavascript。您所要做的就是确保要评估的表达式使用正确的语言。 Groovy可能是最简单的,并且会整合得最好。

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

答案 2 :(得分:1)

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

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

答案 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)

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

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