【问题标题】:Convert a string to expression in java [duplicate]在java中将字符串转换为表达式[重复]
【发布时间】:2017-12-06 10:26:51
【问题描述】:

例如,我有一个String

String s= "(resultSet.get(\"PRIMARY_ROLE\")=='COO Business Management Team' && resultSet.get(\"DEPT_LEVEL\")=='5') ? 1:0";

其中resultSetmap

有没有办法可以将它转换为表达式,以便我可以评估它的值。

说:

int i=  (resultSet.get("PRIMARY_ROLE")=='COO Business Management Team' && resultSet.get("DEPT_LEVEL")=='5') ? 1:0 ;

【问题讨论】:

  • 写一个解析器。或者将其写入具有足够环境的文件以使其成为语法正确的类定义,然后编译、加载和执行它。由于您在编写代码时不知道此字符串,因此它必须来自外部源。执行这样的代码总是很危险的。
  • 这个代码串的来源是什么?提取你需要的部分可能比尝试解析你现在拥有的更容易。
  • 使用现有的解析器,例如这个:github.com/stefanhaustein/expressionparser(免责声明:我有偏见,因为我写的)

标签: java string hashmap


【解决方案1】:

如果每个表达式都是语法正确的 JavaScript,那么您可以使用从 Java 8 开始作为 JDK 的一部分提供的 Oracle Nashorn 引擎(以前是 Mozilla Rhino):

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine se = sem.getEngineByExtension("js");

    String s= "(resultSet.get(\"PRIMARY_ROLE\")=='COO Business Management Team' && resultSet.get(\"DEPT_LEVEL\")=='5') ? 1:0";
    Bindings bindings = se.createBindings();
    bindings.put("resultSet",
            new HashMap<String, String>() {{
                put("PRIMARY_ROLE","COO Business Management Team");
                put("DEPT_LEVEL","5");
            }});

    Object result = se.eval(s, bindings);
    System.out.println("Expression evaluates to "+ result);
}

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 2019-11-24
    • 1970-01-01
    • 2021-07-28
    • 2020-12-22
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多