Java实现字符串每行60字符换行且不拆分单词的问题排查
问题原因
现有代码的逻辑是直接从i + 60位置向后查找第一个空格替换为换行,当第60位落在某个单词内部时,就会出现单词被拆分的问题。
修复后的完整代码
public String formatText(String text) { // 预处理:去除首尾空格,将连续多个空格替换为单个空格 StringBuilder sb = new StringBuilder(text.replaceAll("(^ )|( $)", "").replaceAll("\\s{2,}", " ")); int lineMaxLength = 60; int offset = 0; int contentLength = sb.length(); // 剩余文本长度超过最大行宽时循环处理 while (offset + lineMaxLength < contentLength) { // 从最大允许行尾位置向前找最近的空格作为换行点 int breakPosition = sb.lastIndexOf(" ", offset + lineMaxLength); // 兼容超长单词场景:60字符内无空格时强制在第60位换行 if (breakPosition == -1 || breakPosition <= offset) { breakPosition = offset + lineMaxLength; } // 将换行点的空格替换为换行符 sb.replace(breakPosition, breakPosition + 1, "\n"); // 更新下一行的起始偏移量 offset = breakPosition + 1; contentLength = sb.length(); } return sb.toString(); }
实现逻辑说明
- 预处理逻辑保持和原有需求一致,先完成多倍空格的清理
- 每次从当前行起始位置计算最大允许结束位置(偏移量+60),向前查找最近的空格作为换行位置,保证当前行不会拆分完整单词
- 增加超长单词兼容逻辑,避免出现整行无空格导致的死循环问题
- 换行后更新下一行的起始偏移量,循环处理直到剩余文本长度不足60
内容的提问来源于stack exchange,提问作者Bookuha
相关产品推荐
相关产品推荐

