循环遍历StringBuilder时如何在内容中间新增换行符?
问题原因
- 数组越界:循环条件是
i < sbText.length(),当i走到最后一个索引(sbText.length() - 1)时,调用charAt(i+1)会访问超出范围的索引,直接抛出StringIndexOutOfBoundException。 - 字符比较错误:
charAt()返回的是char基础类型,你用双引号包裹的"\n"是String类型,两者用==比较逻辑完全错误,应该用单引号的'\n'字符常量比较。 - 插入方法用错:
append()是把内容追加到字符串末尾,你需要的是在当前换行符后面插入新的换行,应该用insert()方法。 - 插入后未跳过索引:插入换行后字符串长度会+1,如果你不手动让i往后跳一位,下一轮循环会检测到你刚插入的换行,导致重复插入多个换行。
修复后的遍历实现代码
String ns = "\n"; // 循环只到倒数第二个字符,避免i+1越界 for(int i = 0; i < sbText.length() - 1 ; i++) { if(sbText.charAt(i) == '\n' && sbText.charAt(i+1) != '\n') { // 在当前位置的下一位插入换行 sbText.insert(i+1, ns); // 插入后跳过多出来的这个换行,避免重复判断 i++; } }
更简洁的实现方案
你完全不用自己遍历处理,直接用正则替换就能实现需求,匹配所有前后都没有换行的单个换行符,替换成两个换行即可:
String result = sbText.toString().replaceAll("(?<!\\n)\\n(?!\\n)", "\n\n"); // 如果要保留StringBuilder对象可以这么写: sbText = new StringBuilder(result);
内容的提问来源于stack exchange,提问作者Akhilesh Raturi
相关产品推荐
相关产品推荐

