Java 获取括号之间的字符串

Java 获取括号之间的字符串,java,android,regex,parentheses,getstring,Java,Android,Regex,Parentheses,Getstring,可能重复: 我正在使用外部库“beanshell”的一个名为transparer.eval()的方法,该方法允许使用字符串进行数学运算并返回解 Interpreter interpreter = new Interpreter(); String st = "x = 2+4*1*(2*(1+1)^2)^2 + (4+5)^2"; int index = -2; char prev; char post; int openPar = -1;

可能重复:

我正在使用外部库“beanshell”的一个名为transparer.eval()的方法,该方法允许使用字符串进行数学运算并返回解

    Interpreter interpreter = new Interpreter();
    String st = "x = 2+4*1*(2*(1+1)^2)^2 + (4+5)^2";

    int index = -2;
    char prev;
    char post;
    int openPar = -1;
    if (st.contains("^")) {

        index = st.indexOf("^");

        while (index != -1) {

            prev = st.charAt(index - 1);
            post = st.charAt(index + 1);

            if (prev == ')') {
                int match = 0;
                int i = index - 2;
                char check = '0';

                boolean contiunar = true;
                while (contiunar) {
                    check = st.charAt(i);

                    if (check == ')')
                        match++;

                    if (check == '(') {

                        if (match == 0) {

                            openPar = i;
                            contiunar = false;
                        } else
                            match = match - 1;
                    }

                    i = i - 1;

                }

                String rep = st.substring(openPar + 1, index - 1);
                String resultado = "";
                try {
                    interpreter.eval("r= Math.pow(" + rep + "," + post
                            + ")");
                    resultado = interpreter.get("r").toString();

                } catch (EvalError e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                st = st.replace("(" + rep + ")^" + post, resultado);

            } else {
                st = st.replace(prev + "^" + post, prev + "*" + prev);
            }

            index = st.indexOf("^");

        }

    }
它工作得很好,但是如果我想提高到二次方或者得到平方根,我必须修改原始字符串,就像

String st=“x=2+4*a*(b+c)^2”

我需要获取括号之间的字符,以将“”(b+c)^2“替换为“”(b+c)*(b+c)“或“”Math.pow((b+c),2)”

我该怎么做? 提前谢谢

----编辑----

最后我找到了解决办法

    Interpreter interpreter = new Interpreter();
    String st = "x = 2+4*1*(2*(1+1)^2)^2 + (4+5)^2";

    int index = -2;
    char prev;
    char post;
    int openPar = -1;
    if (st.contains("^")) {

        index = st.indexOf("^");

        while (index != -1) {

            prev = st.charAt(index - 1);
            post = st.charAt(index + 1);

            if (prev == ')') {
                int match = 0;
                int i = index - 2;
                char check = '0';

                boolean contiunar = true;
                while (contiunar) {
                    check = st.charAt(i);

                    if (check == ')')
                        match++;

                    if (check == '(') {

                        if (match == 0) {

                            openPar = i;
                            contiunar = false;
                        } else
                            match = match - 1;
                    }

                    i = i - 1;

                }

                String rep = st.substring(openPar + 1, index - 1);
                String resultado = "";
                try {
                    interpreter.eval("r= Math.pow(" + rep + "," + post
                            + ")");
                    resultado = interpreter.get("r").toString();

                } catch (EvalError e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                st = st.replace("(" + rep + ")^" + post, resultado);

            } else {
                st = st.replace(prev + "^" + post, prev + "*" + prev);
            }

            index = st.indexOf("^");

        }

    }
使用此命令,我修改了原始字符串x=2+4*1*(2*(1+1)^2)^2+(4+5)^2(例如)

x=2+4*1*64+81

  • 首先搜索第一个“^”
  • 获取上一个字符
  • 如果有",
  • 搜索前一个字符,同时在(()之前找到“(”但是如果找到“)”,必须找到2“(”),一个打开内部括号,第二个打开我想要pow的括号
  • 这是在“(2+(3+4)+5)^2”->返回“2+(3+4)+5”而不是“3+4)+5”的情况下

    现在替换为更正表达式Math.pow(“结果”,“2”)”,并逐步计算 (1+1)^2 = 4 (2*4)^2=64

    (4+5)^2=81

    最后,现在我可以使用解释器计算retun.eval()


    非常感谢您的回答!

    您将需要解析字符串。您可以编写一个完整的解析器并逐个字符地进行解析

    否则,如果您有一个特定的流程图(使用操作符),请使用String.split(\“*(…)功能,您可以根据您的delimeters创建标记


    希望这有帮助。

    当然,您需要解析字符串。您可以将其转换为中间状态(您可以很快执行)。您可以看到以下链接,或许它可以帮助您尝试以下代码来完成任务

    String originalString ="x = 2+4*a*(b+c)^2";
    String stringToInsert = "Math.pow((b+c),2)";
    
    int startIndex = originalString.indexOf("(");
    int endIndex = originalString.indexOf(")");
    
    String firstPortion = originalString.substring(0,startIndex);
    String lastPortion = originalString.substring(endIndex+1);
    String finalString = firstPortion + stringToInsert + lastPortion;
    
    System.out.println("finalString : "+finalString);
    

    你解了吗??,如果没有,请在这里发表评论。谢谢你的回答。它是有效的,但我需要解方程,比如:x=2/(a+b*(3*c+a)^2)…在它上面不起作用