我有以下字符串,希望跟踪字符串中ROUND()的右括号。
"=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18)))/$M$12;$M$11)";

public class RoundParser {

    public static String parseRound(String text) {

        text = text.toUpperCase();

        String result;

        char[] ch = text.toCharArray();
        int count = -1;
        String temp = "";
        for (int i = 0; i < ch.length; i++) {
            temp = temp + ch[i];

            System.out.println(count);

            if ("ROUND(".equals(temp)) {
                count++;
            }
            if ("(".equals(temp)) {
                count++;
            }
            if (")".equals(temp) && count > 0) {
                count--;
            }
            if (")".equals(temp) && count == 0) {
                ch[i] = '#';
            }
            if (!"ROUND(".startsWith(temp) || temp.length() > 5) {
                temp = "";
            }
        }

        text = String.valueOf(ch);

        result = text;
        return result;
    }

    public static void main(String[] args) {
        String text = "=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18)))/$M$12;$M$11)";

        System.out.println(parseRound(text));
    }

}

但是,使用我的解析器,我得到:
=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18))#/$M$12;$M$11#
我想得到的结果是:
=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10#/$M$9;CA18*CB18)))/$M$12;$M$11#
如您所见,不在右边的)被替换为;$M$11)";;$M$10)。如果你知道如何重新计算这两个案子的费用,我真的很感激。

最佳答案

有两种方法
1)如果开括号和闭括号的数目总是相等的,那么可以使用for循环来跟踪最后一个闭括号。
2)如果您不确定开方括号和闭方括号是否相等,则可以执行以下操作-->

public class RoundParser {

    public static String parseRound(String text) {

        text = text.toUpperCase();

        String result;

        char[] ch = text.toCharArray();

     int count=0,pos=0;
        int c[10];
        for(int i=0;i<ch.length;i++){

        if(ch[i].equals("(")){
        count++;
         if(ch[i-1].equals("D")){
              c[pos]=count;   //will store the count value at every opening round
                  pos++;
              }
        }

        if(ch[i].equals(")")){
        count--;
         for(int j=0;j<10;j++){
             if(c[j]==count)   //if the closing of round had been encountered
                   ch[i]="#";
         }
       }

        }


        text = String.valueOf(ch);

        result = text;
        return result;
    }

    public static void main(String[] args) {
        String text = "=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18)))/$M$12;$M$11)";

        System.out.println(parseRound(text));
    }

}

给你。
我认为这应该管用。
希望这有帮助。

关于java - 字符串中的跟踪括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24362335/

10-11 01:43