You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中replaceAll("-+")无法替换"-+"组合,其余替换正常,求原因

问题:Java replaceAll无法处理"-+"组合导致加减表达式计算错误

我编写了一款Java程序,可计算用户输入的任意格式加减表达式的总和,但调试发现输入如“10 - +10”时,程序输出10而非预期的0。排查后发现replaceAll("-+", "-")无法将字符串中的"-+"组合替换为"-",其余replaceAll操作均正常。

程序代码如下:

package addemup;

import java.util.Scanner;

public class AddEmUp {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);

        System.out.println("Enter something like 8 + 33 + 1,345 +137 : ");
        String s = kb.nextLine();

        s = s.replaceAll(",", "");
        s = s.replaceAll(" ", "");
        s = s.replaceAll("--", "+");
        s = s.replaceAll("-+", "-");
        s = s.replaceAll("-", "+-");
        s = s.replaceAll("\\++", "+");

        Scanner sc = new Scanner(s);
        sc.useDelimiter("\\s*\\+\\s*");

        // System.out.println(s);
        int runningTotal = 0;
        while (sc.hasNextInt()) {
            runningTotal = runningTotal + sc.nextInt();
        }
        System.out.println(runningTotal);
    }

}

问题原因

核心问题出在对正则表达式语法的误解:

replaceAll("-+", "-")中的正则模式-+不是匹配"减号+加号"的组合,而是匹配一个或多个连续的减号。因为在正则表达式中,+是一个量词,作用是匹配它前面的元素(这里是-)一次或多次。

以输入“10 - +10”为例,去掉空格后字符串变为10-+10:

  1. 执行replaceAll("-+", "-")时,字符串里的-后面跟的是+,不是连续的减号,所以这个正则完全不匹配,字符串保持10-+10不变。
  2. 后续执行replaceAll("-", "+-")会把单独的-替换成+-,字符串变成10+-+10。
  3. 最后replaceAll("\\++", "+")只会合并连续的加号,但这里的+都是单独出现的,所以字符串还是10+-+10。
  4. 用+作为分隔符分割后,得到的片段是10、-、10,其中-不是整数,只会被Scanner忽略,最终只累加了10,导致输出错误。

如果要匹配"减号+加号"的组合,需要把+转义为字面量(因为+在正则里是特殊字符),改成replaceAll("-\\+", "-"),或者调整处理顺序,先处理这种特殊组合再处理其他替换逻辑。

内容的提问来源于stack exchange,提问作者UnremarkableLegend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:50:39