
本文介绍使用正则表达式 R|, 一次性分割包含多行、以逗号分隔的字符串,从而可靠提取所有整数字符串或直接转换为 int 数组。
本文介绍使用正则表达式 ` |,` 一次性分割包含多行、以逗号分隔的字符串,从而可靠提取所有整数字符串或直接转换为 int 数组。
在处理从文件读取的结构化文本数据(如每行多个逗号分隔的整数)时,常见误区是分别对换行符和逗号做两次 split() 操作——这不仅逻辑冗余,而且 Java 的 String.split() 不支持“链式分割”,多次调用会破坏原始数据结构(例如误将末尾数字因缺失结尾逗号而丢失)。
正确做法是使用单个正则表达式同时匹配行分隔符与逗号。Java 支持 R 这一内置转义序列,它能跨平台匹配任意系统行分隔符(包括
、
、
等),避免硬编码 System.lineSeparator() 带来的可移植性问题。配合 |(或运算符),即可构建通用分割模式:
String[] values = str.split("\R|,");
⚠️ 注意:正则中 R 不能写在字符类内(如 [\R,] 是非法的),必须作为独立分支使用;且需对反斜杠进行 Java 字符串转义,故写作 "\R|,"。
若目标是获得 int[] 而非 String[],可结合 Stream API 链式处理,简洁高效:
int[] ints = Arrays.stream(str.split("\R|,"))
.map(String::trim) // 可选:去除可能的空格(如 "40, 25" 中的空格)
.mapToInt(Integer::parseInt)
.toArray();
✅ 示例验证(基于提问中的首行数据):
String data = "9,4, 11, 2, 40, 17,11,20,9,20, 15,13, 19, 35,12,14, 13,1, 0,20,9, 1
40,29, 40, 25, 30, 12";
int[] result = Arrays.stream(data.split("\R|,"))
.map(String::trim)
.mapToInt(Integer::parseInt)
.toArray();
System.out.println(Arrays.toString(result));
// 输出:[9, 4, 11, 2, 40, 17, 11, 20, 9, 20, 15, 13, 19, 35, 12, 14, 13, 1, 0, 20, 9, 1, 40, 29, 40, 25, 30, 12]
? 总结:
- 优先使用
R替代System.lineSeparator(),提升代码健壮性与跨平台兼容性; - 利用
split("\R|,")实现“一招分割”,避免手动拼接或嵌套循环; - 结合
trim()处理常见空格干扰,再通过Integer::parseInt安全转换; - 若原始数据格式严格(无空格),可省略
trim();若有异常格式(如空字符串、非数字),建议添加filter(s -> !s.isEmpty())或 try-catch 异常处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











