Java 以字符串形式对括号中的表达式求值

Java 以字符串形式对括号中的表达式求值,java,string,parsing,replace,Java,String,Parsing,Replace,在Java中,如果我有一个像“(3+5)x+x^(6/2)”这样的字符串,我如何用它们的求值替换括号中的所有表达式,以获得字符串“8x+x^3”?,这取决于您尝试执行的操作。对于更复杂的情况,您可以/应该使用像ANTLR这样的解析器生成器。如果表达式不比示例(简单算术)更复杂,您可以尝试使用JavaScript/Nashorn分析表达式 使用的解决方案,您可以执行以下操作: public static void main(String[] args) throws ScriptException

在Java中,如果我有一个像
“(3+5)x+x^(6/2)”
这样的字符串,我如何用它们的求值替换括号中的所有表达式,以获得字符串
“8x+x^3”

,这取决于您尝试执行的操作。对于更复杂的情况,您可以/应该使用像ANTLR这样的解析器生成器。如果表达式不比示例(简单算术)更复杂,您可以尝试使用JavaScript/Nashorn分析表达式

使用的解决方案,您可以执行以下操作:

public static void main(String[] args) throws ScriptException {

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    String x = "(3+5)x + x^(6/2)";

    // can also be extended to expressions like 3+5*5 with 
    // Pattern.compile("\\(\\d+([+/*-]\\d+)+\\)")
    Pattern simpleArithmeticExpr = Pattern.compile("\\(\\d+[+/]\\d+\\)"); 
    Matcher matcher = simpleArithmeticExpr.matcher(x);
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        String expr = matcher.group();
        String evaluatedExpr = String.valueOf(engine.eval(expr));
        matcher.appendReplacement(sb, evaluatedExpr );
    }
    matcher.appendTail(sb);
    System.out.println(sb); // 8x + x^3

}

如果Javascript解决方案是慢/重,您也可以自己解析。

非常感谢您的帮助!