不使用replace()替换字符串中所有指定单词的Java代码运行无输出问题
问题排查与实现方案
现有代码的核心问题:
- 字符长度计算错误:
Python是6个字符,你代码里取的是substring(test, test + 5),按照Java substring左闭右开的规则只能拿到5个字符,if判断永远不成立,result全程是空字符串,自然没有输出。 - 拼接逻辑错误:就算长度修正正确,现有逻辑每匹配到一次就拼接一次完整的前后段,遇到多个匹配项时会出现内容重复拼接的问题。
- 边界处理缺失:如果字符串中没有要匹配的目标单词,方法会直接返回空字符串,而不是原字符串。
不使用replace()的正确实现思路:
采用指针遍历的方式逐段匹配拼接,核心逻辑如下:
- 先获取待替换旧单词的长度,初始化结果容器和遍历起始指针
- 遍历字符串时每次从当前指针位置开始匹配旧单词
- 匹配成功就把指针到匹配位置之间的普通字符、新单词依次拼入结果,再把指针跳到旧单词结束的位置
- 匹配失败就把剩余所有字符拼入结果,结束遍历
修正后完整代码:
public class ReplaceWord { // 通用替换方法:将str中所有oldWord替换为newWord public static String replaceWord(String str, String oldWord, String newWord) { int strLen = str.length(); int oldLen = oldWord.length(); StringBuilder result = new StringBuilder(); int pos = 0; // 遍历起始指针 while (pos <= strLen - oldLen) { // 匹配当前位置是否是旧单词 if (str.substring(pos, pos + oldLen).equals(oldWord)) { result.append(newWord); pos += oldLen; // 指针跳过硬匹配到的旧单词 } else { result.append(str.charAt(pos)); pos++; // 不匹配就移动一位指针 } } // 拼接最后剩下的不足oldLen长度的字符 result.append(str.substring(pos)); return result.toString(); } public static void main(String args[]) { String test = "Oh my god I love Python so much! Python is great!"; // 调用方法将所有Python替换为Java System.out.println(replaceWord(test, "Python", "Java")); } }
补充说明:代码里用StringBuilder是为了提升字符串拼接效率,如果你不想用也可以换成String直接+=,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Skyism _
相关产品推荐
相关产品推荐

