簡體   English   中英

這種分組方法有什么問題? (分割字符串)

[英]What's wrong with this group method? (split String)

有人可以通過此遞歸功能幫助我:

輸入一個字符串=“ 5.5 + 33 + 22”;

正則表達式將第一個數字+運算符=“ 5.5 + 33”分割並計算總和或減法。 對結果值+仍要處理的字符串部分調用遞歸調用:“ 38.5 + 22”

我收到了這個錯誤:我猜group方法出了點問題,但是我沒有解決

致命異常:主進程:com.example.marco.calcol,PID:9798 java.lang.ArrayIndexOutOfBoundsException:length = 2; index = 2在java.util.regex.Matcher.group(Matcher.java:370)在com.example.marco.calcol.MainActivity.compute(MainActivity.java:138)在com.example.marco.calcol.MainActivity $ 14 .onClick(MainActivity.java:107)........

 public void compute(String displ) {
    Pattern p = Pattern.compile("^\\d+(?:\\.\\d+)?[+-]\\d+(?:\\.\\d+)?");
    Matcher m = p.matcher(displ);
    if (m.find()) {
        String s = m.group(1);     // CRASH HERE row(MainActivity.java:138)
        if (s.indexOf('+') >= 0) {
            int index = s.indexOf('+');
            Double a = Double.parseDouble(s.substring(0, index - 1));
            Double b = Double.parseDouble(s.substring(index + 1, s.length()));
            this.sum = this.sum + a + b;
        }
        if (s.indexOf('-') > 0) {
            int index = s.indexOf('-');
            Double a = Double.parseDouble(s.substring(0, index - 1));
            Double b = Double.parseDouble(s.substring(index + 1, s.length()));
            this.sum = this.sum + a - b;
        }
        displ.substring(s.length());

        compute(Double.toString(sum).concat(displ));
    }

}

正則表達式中沒有捕獲組,因此group(1)無效。 如果需要整個匹配,請使用group()group(0)

public void compute(String displ) {
    Pattern p = Pattern.compile("(\\d+(?:\\.\\d+)?)([+-])(\\d+(?:\\.\\d+)?)");
    for (;;) {
        Matcher m = p.matcher(displ);
        if (!m.find()) {
            break;
        }
        double lhs = Double.parseDouble(m.group(1));
        String op = m.group(2);
        double rhs = Double.parseDouble(m.group(3));
        double result = 0;
        switch (op) {
        case "+":
            result = lhs + rhs;
            break;
        case "-":
            result = lhs - rhs;
            break;
        }
        displ = displ.substring(0, m.start())
            + result
            + displ.substring(m.end());

    }
    System.out.println(displ);
}

(?: ... )是一個非捕獲組,不算作m.group(i) 使用普通組(...)您可以立即提取識別出的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM