我正在寻找一种相对简单(与编写解析器相比)的方法来评估Java中的布尔表达式,我不想使用JEP库.
我有一个像String这样的String表达式(x > 4 || x < 8 && p > 6)
,我的目标是用值替换变量.
有没有办法评估这个表达式?
请记住,这可能是任何级别的深度,因此编写解析器将非常复杂.
使用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));
您可以在Java6中使用脚本引擎,并选择任何流行的脚本语言,如Scala,Ruby,Python,Groovy和Javascript.您所要做的就是确保要评估的表达式使用正确的语言.Groovy可能是最简单的,并且将最好地集成.
我已经成功地使用这种方法来提供功能,就像流行的电子表格应用程序中的公式/计算列一样.