【发布时间】: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", "&&").replace("OR", "||")).replaceAll(m -> String.valueOf(values.get(Integer.parseInt(m.group())))))); -
@shmosel 这是一个糟糕的主意。这就是您获得远程代码执行的方式。不要把 JS 用在这么简单的事情上,也不要在一行中完成
-
@Clashsoft 我知道,我只是讨厌将多个语句压缩成一行注释。
标签: java parsing logical-operators apex expression-evaluation