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:
- 执行
replaceAll("-+", "-")时,字符串里的-后面跟的是+,不是连续的减号,所以这个正则完全不匹配,字符串保持10-+10不变。 - 后续执行
replaceAll("-", "+-")会把单独的-替换成+-,字符串变成10+-+10。 - 最后
replaceAll("\\++", "+")只会合并连续的加号,但这里的+都是单独出现的,所以字符串还是10+-+10。 - 用
+作为分隔符分割后,得到的片段是10、-、10,其中-不是整数,只会被Scanner忽略,最终只累加了10,导致输出错误。
如果要匹配"减号+加号"的组合,需要把+转义为字面量(因为+在正则里是特殊字符),改成replaceAll("-\\+", "-"),或者调整处理顺序,先处理这种特殊组合再处理其他替换逻辑。
内容的提问来源于stack exchange,提问作者UnremarkableLegend
相关产品推荐
相关产品推荐

