【问题标题】:Parse parenthesized Boolean String Expressions with Java使用 Java 解析带括号的布尔字符串表达式
【发布时间】:2014-07-25 07:47:24
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过应用正则表达式并将其转换为布尔值?
  • 我认为这是一个解决方案。 stackoverflow.com/questions/12203003/…
  • 您是在寻找解析还是只想要最终结果?
  • 最终的结果可以解决问题。

标签: java string parsing evaluation boolean-expression


【解决方案1】:

如果您使用 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 运算符 (!=) 完全相同,因此您可以将其映射到该运算符。

【讨论】:

    【解决方案2】:

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

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

    没想到会这么简单。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2021-07-11
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多