java - 这种分组方法有什么问题吗? (分割字符串)

标签 java android regex string

有人可以帮助我使用这个递归函数:

接受输入字符串=“5.5+33+22”;

正则表达式分割第一个数字+运算符=“5.5+33”并计算总和或减法。对结果值+仍要处理的字符串部分调用递归调用:“38.5+22”

我收到这个错误: 我猜想 group 方法有问题,但我没能解决它

FATAL EXCEPTION: main Process: com.example.marco.calcol, PID: 9798 java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 at java.util.regex.Matcher.group(Matcher.java:370) at com.example.marco.calcol.MainActivity.compute(MainActivity.java:138) at 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));
    }

}

最佳答案

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)。 使用普通组(...)您可以立即提取已识别的元素。

关于java - 这种分组方法有什么问题吗? (分割字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46575235/

相关文章:

java - java中的无限while循环和循环错误计数

java - RestController - 将 POST 请求转发到外部 URL

regex - 如何将字符串数字转换为实数?

java - 如何克隆 CharArrayWriter?

java - 如何从 ConstraintViolationException 中获取数据库字段名称 - Hibernamte

android - oauth2 : Android authentication against spring boot

java - 从 Java 中嵌套函数的内部函数返回外部函数的值(或不返回任何值)

Google Play 服务 LocationClient 的 java.util.ConcurrentModificationException

c++ - boost 正则表达式排除一个字符

java - 在标记以下字符串 40 println "Hello ",(5+6-4), "-4"时,显示的是单个标记,而不是单独的标记