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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:03:12