Java中拆分多行字符串应优先用split("\R")(Java 8+)或lines()(Java 11+),注意换行符兼容性、空行保留(需limit=-1)、首尾空白处理及BOM去除。

Java中拆分多行字符串,核心是识别换行符并用split()或StringTokenizer等工具处理,但要注意不同系统换行符差异(\n、\r\n、\r)以及空行、首尾空白等常见边界情况。
用split()处理多行字符串(推荐)
split()最常用,关键是正则表达式要兼容各种换行符。直接写"\n"会漏掉Windows的\r\n或旧Mac的\r。
- 用
split("\\R")(Java 8+):\\R是Unicode换行符通配符,自动匹配\n、\r\n、\r等所有标准换行形式 - 兼容老版本可写
split("\\r\\n|\\r|\\n"),注意顺序:把\\r\\n放前面,避免\r提前截断 - 加
trim()再拆分,能避免首尾空行干扰:text.trim().split("\\R")
保留空行?用split()的负数limit参数
默认split()会丢弃末尾空字符串(比如文本末尾有换行)。想保留所有行(包括空行),传-1作limit:
-
String[] lines = text.split("\\R", -1);—— 空行也会作为数组元素存在 - 对比:
split("\\R")(无limit)遇到连续换行时,中间空行保留,但结尾多个换行会被压缩
逐行处理?用Lines()流式操作(Java 11+)
如果不需要数组,而是遍历、过滤或转换每行,lines()更简洁安全:
立即学习“Java免费学习笔记(深入)”;
text.lines().forEach(System.out::println);- 自动跳过
null,内部已处理换行符兼容性,还支持链式操作:text.lines().filter(s -> !s.isBlank()).map(String::trim).collect(Collectors.toList()) - 注意:
lines()返回的是Stream,不缓存结果,适合一次处理;需多次访问建议先转成List
特殊场景:带BOM的UTF-8文件内容
从文件读取的多行字符串开头可能含BOM(\uFEFF),导致第一行出现异常字符:
- 读取后先去除BOM:
text.startsWith("\uFEFF") ? text.substring(1) : text - 或用
Files.readString(path, StandardCharsets.UTF_8)(Java 11+),它会自动忽略BOM
基本上就这些。选split("\\R")最省心,Java 11起优先用lines(),处理老旧环境再考虑手动适配换行符。不复杂但容易忽略细节。










