java中string.split()默认丢弃尾部空字符串,因split(regex)等价于split(regex, 0);要保留需传入负数(如-1)或足够大的正数作为limit参数,并注意正则特殊字符须转义。

Java中String.split()方法默认会丢弃尾部的空字符串,这是由其重载方法split(String regex)的实现决定的——它等价于split(regex, 0),而限制参数为0时会忽略末尾的空项。
使用带limit参数的split方法
要保留尾部空字符串,关键在于显式传入一个**负数或足够大的正数**作为limit参数,让split不执行“丢弃尾部空串”的逻辑:
- limit为负数(如-1):不限制分割次数,且保留所有结果,包括开头、中间和尾部的空字符串
- limit为正数且足够大(如Integer.MAX_VALUE):最多分割limit-1次,剩余部分作为最后一个元素;若分隔符连续出现或出现在末尾,空串会被保留
示例对比
假设字符串为"a,b,c,"(末尾有逗号):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
"a,b,c,".split(",")→["a", "b", "c"](尾部空串丢失) -
"a,b,c,".split(",", -1)→["a", "b", "c", ""](尾部空串保留) -
"a,,b,".split(",", -1)→["a", "", "b", ""](所有空位置都保留)
注意特殊分隔符的转义
如果分隔符是正则特殊字符(如.、|、*、+等),必须进行转义,否则会按正则语义匹配:
- 按点号分割:
"a.b.c.".split("\.", -1) - 按竖线分割:
"a|b|c|".split("\|", -1) - 避免写成
split(".", -1)——这会匹配任意字符,导致意外结果
替代方案:用StringTokenizer(不推荐)或手动拆分
StringTokenizer不基于正则,天然保留空字段,但它是遗留类,不支持正则,且无法处理复杂场景;更稳妥的做法仍是用split(regex, -1)。若需高度可控,也可用Pattern.compile(regex).splitAsStream(str)配合limit = -1,效果一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










