
本文详解在java中安全、跨平台地移除字符串内换行符(包括` `、` `、` `)的多种方法,涵盖java 7至java 13+的兼容方案,并指出常见误区(如仅匹配` `导致遗漏)、推荐正则表达式及现代api用法。
在处理用户输入、读取文本文件或解析多行字符串时,常需清除换行符以获得单行连续文本(例如 "strengthened columns with GRPES" → "strengthened columns with GRPES")。但许多开发者误以为仅替换 即可覆盖所有场景——实际上,不同操作系统和编辑器生成的换行符各不相同:Windows 使用 ,Unix/Linux/macOS 使用 ,而旧版 macOS(Classic)使用 。若只匹配 \r\n(如原代码 in.replaceAll("\r\n", "")),将无法处理纯 或 ,导致结果仍含残留换行。
✅ 推荐方案:跨平台兼容的正则替换(Java 7+)
最健壮且向后兼容的方式是使用正则表达式匹配任意标准换行序列:
String in = "strengthened columns
with GRPES
";
in = in.replaceAll("\r\n|\r|\n", "");
System.out.println(in); // 输出:strengthened columns with GRPES该正则 | | 采用“或”逻辑,一次性覆盖全部三种换行符。注意:replaceAll() 的第一个参数是正则表达式,因此反斜杠需双写;第二个参数为空字符串 "" 表示删除。
⚠️ 注意事项:避免使用 in.replace(" ", "") —— 这是字面量替换,仅处理 ,不匹配 ;replaceAll("\n", "") 同样不完整,因 中的 未被清除,可能残留孤立的 (影响后续处理);若字符串含制表符( )或多余空格,可链式调用:.replaceAll("\s+", " ").trim() 实现标准化清理。
✅ 现代方案:Java 13+ 文本块 + stripIndent() + replaceAll()
若项目已升级至 Java 13+,配合文本块(Text Blocks)可更优雅地处理多行原始字符串:
立即学习“Java免费学习笔记(深入)”;
String in = """
strengthened columns
with GRPES
""";
// 先去除缩进,再移除所有换行符(含内部空格规范化)
in = in.stripIndent().replaceAll("\s+", " ").trim();
System.out.println(in); // 输出:strengthened columns with GRPESstripIndent() 自动移除公共前导空白,replaceAll("\s+", " ") 将连续空白(含换行、制表、空格)压缩为单个空格,trim() 清除首尾空格——这是生产环境中更鲁棒的清洗策略。
总结
- 核心原则:换行符具有平台差异性,必须统一处理 、 、 ;
- Java 7–12:优先使用 replaceAll("\r\n|\r|\n", "");
- Java 13+:结合 stripIndent() 与空白归一化,兼顾可读性与健壮性;
- 永远避免硬编码单一换行符,测试时务必覆盖 Windows( )、Linux( )来源的字符串样本。










