使用Java解析带括号的布尔字符串表达式

时间:2014-07-25 07:47:25

标签: java string parsing evaluation boolean-expression

我需要评估我在String中收到的带括号的布尔表达式。由于我需要处理变量表达式,我需要找到一种方法将其解析为一个布尔表达式,以便在java中对其进行求值。 String表达式的示例是:

String boolexpr1 = "(!(true||false)&&!((true)^(true)))"

可能的运算符是括号,AND,OR,XOR,NOT。由于这已经是一个Java可处理的表达式,我认为应该很容易解析它,但是想不出一个优雅的解决方案。我也在网上找到了一些代码,但它要么与其他/更少的运营商打交道,没有括号,要么仍然太复杂。

2 个答案:

答案 0 :(得分:3)

如果你正在使用Spring,你可以使用SpEL,它支持相同的布尔表达式,如下所示:

  • 它通常方式比JS引擎更快(在粗略测试中,它的速度提高了20-22倍);
  • 解析器实例是线程安全的;
  • 它简单易用,就像JS引擎一样;
  • 它远远少于JS引擎的资源密集度(在生产中,使用JS引擎的CPU使用率从5%跃升至60%。与SpEL保持一致)。

使用示例:

ExpressionParser ep = new SpelExpressionParser();
Expression exp = ep.parseExpression("(!(true||false)&&!((true) != (true)))");
exp.getValue(Boolean.class);

布尔值的XOR运算符(^)的工作原理与Not Equal运算符(!=)完全相同,因此您可以将其映射到该值。

答案 1 :(得分:0)

我找到了一个使用JavaScript的解决方案:

String boolexpr1 = "(!(true||false)&&!((true)^(true)))"
boolean result = (Boolean) new ScriptEngineManager().getEngineByName("javascript").eval(boolexpr1);

没想到它会那么简单。