Java中拆分多行字符串应优先用split("\R")(Java 8+)或lines()(Java 11+),注意换行符兼容性、空行保留(需limit=-1)、首尾空白处理及BOM去除。
Java中拆分多行字符串,核心是识别换行符并用split()或StringTokenizer等工具处理,但要注意不同系统换行符差异(
\n、\r\n、\r)以及空行、首尾空白等常见边界情况。
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()会丢弃末尾空字符串(比如文本末尾有换行)。想保留所有行(包括空行),传-1作limit:
String[] lines = text.split("\\R", -1); —— 空行也会作为数组元素存在split("\\R")(无limit)遇到连续换行时,中间空行保留,但结尾多个换行会被压缩如果不需要数组,而是遍历、过滤或转换每行,lines()更简洁安全:
text.lines().forEach(System.out::println);null,内部已处理换行符兼容性,还支持链式操作:text.lines().filter(s -> !s.isBlank()).map(String::trim).collect(Collectors.toList())
lines()返回的是Stream,不缓存结果,适合一次处理;需多次访问建议先转成List从文件读取的多行字符串开头可能含BOM(\uFEFF),导致第一行出现异常字符:
text.startsWith("\uFEFF") ? text.substring(1) : text
Files.readString(path, StandardCharsets.UTF_8)(Java 11+),它会自动忽略BOM基本上就这些。选split("\\R")最省心,Java 11起优先用lines(),处理老旧环境再考虑手动适配换行符。不复杂但容易忽略细节。