【问题标题】:Dynamic logical expression parser/evaluation in Java/ApexJava/Apex 中的动态逻辑表达式解析器/求值
【发布时间】:2022-01-03 20:13:48
【问题描述】:

最终用户可以在字符串中定义条件选择/逻辑表达式,如下所示:

  • String expression = "((1 OR 2) AND 6 AND (3 OR 4)) AND 5";
  • String expression = "(1 AND 2 AND 3 AND 4) OR (5 AND 6)";
  • 等等……

1, 2, 3, ... 的值被预先计算并存储在像{1: true, 2: false, 3: true, ...}这样的映射中

要求是用map中存储的值对上面的表达式求值,得到真/假的最终输出。

例如:

String expression = "(1 AND 2) OR 3";
Map<Integer, Boolean> values = new Map<Integer, Boolean>{1=> true, 2=> false, 3=> true};
System.debug(evaluate(expression, values)); // This should print true

在上面的示例中,“(1 AND 2) OR 3”的计算结果应为“(true AND false) OR true”,从而得出最终的正确答案。

我在编写evaluate 方法时需要帮助。

【问题讨论】:

  • 请参阅我的 SO 文章,了解如何编写递归下降解析器,然后生成(表达式)树。它有其他部分告诉您必须评估表达式而不是生成表达式树。 stackoverflow.com/a/2336769/120163
  • System.out.println(new ScriptEngineManager().getEngineByName("javascript").eval(Pattern.compile("\\d+").matcher(expression.replace("AND", "&amp;&amp;").replace("OR", "||")).replaceAll(m -&gt; String.valueOf(values.get(Integer.parseInt(m.group()))))));
  • @shmosel 这是一个糟糕的主意。这就是您获得远程代码执行的方式。不要把 JS 用在这么简单的事情上,也不要在一行中完成
  • @Clashsoft 我知道,我只是讨厌将多个语句压缩成一行注释。

标签: java parsing logical-operators apex expression-evaluation


【解决方案1】:

我通过嵌入Apache Jexl 解决了这些问题。 否则,如果您想创建自己的解析器,请使用 Antlr - 它可能有一个现成的示例供您使用。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2015-09-02
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-11-14
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多