Java中替换"is"为"is not"时出现多余字符的问题排查
问题分析与解决
为啥会多出个"s"?
你这段代码是逐个字符遍历输入字符串的:
当i指向"is"里的"i"时,if条件匹配成功,你手动把"i"+"s"+" "+"not"追加到了StringBuilder里。但循环会继续执行i++,下一次i就指向了"is"里的"s"——这时候这个"s"不满足if的判断条件(它的前一个字符是"i"不是空格),所以会进入else分支,把这个"s"又追加了一遍。结果自然就变成了"is not s"。
为啥加i+=2就好使?
原循环每次结束都会自动执行i++,当你在if分支里加i+=2,相当于处理完"i"这个位置后,直接让i跳过"is"的第二个字符"s":
比如当前i是3(指向"i"),执行i+=2后i变成5,然后循环自带的i++让i变成6,刚好跳过了索引4的"s",这个"s"不会被再次处理,也就不会被重复追加,结果就正常了。
额外的坑要注意
你的代码还有索引越界的问题:
- 如果"is"在字符串开头(比如"is great"),
i=0的时候i-1就是-1,调用charAt(-1)直接报错; - 如果"is"在字符串结尾(比如"Life is"),
i+2会超出字符串长度,同样报错。
更省心的实现方式
其实不用手动遍历字符折腾,Java的String类自带replaceAll方法,用正则匹配独立的"is"单词就行:
negativeOutput = positiveInput.replaceAll("\\bis\\b", "is not");
这里的\\b是正则的单词边界,只会匹配单独的"is",不会误改"this"或者"island"里的"is"。
内容的提问来源于stack exchange,提问作者anothercodingnoob
相关产品推荐
相关产品推荐

