String.split()默认丢弃结尾空字符串,如"a,b,c,,,".split(",")返回["a","b","c"];要保留所有空串需用-1参数,如.split(",",-1);正则特殊字符需转义或用Pattern.quote()。

Java 中 String.split() 方法看似简单,但用正则表达式分割时,空字符串的处理容易踩坑——关键在于理解它的默认行为和边界情况。
split 的默认空字符串丢弃机制
调用 str.split(regex)(无 limit 参数)时,末尾连续的匹配会直接被丢弃,不生成空字符串元素。比如:
"a,b,c,,,".split(",") → 返回 ["a", "b", "c"](最后三个逗号产生的 3 个空串全被忽略)
这是因为该重载等价于 split(regex, 0),而 limit = 0 表示“尽可能分割,但丢弃结尾的空字符串”。
立即学习“Java免费学习笔记(深入)”;
保留所有分割结果:用 limit = -1
要让所有空字符串(包括开头、中间、结尾)都保留在结果数组中,必须显式传入 -1:
-
"a,b,c,,,".split(",", -1)→["a", "b", "c", "", "", ""] -
",,a,b".split(",", -1)→["", "", "a", "b"] -
"a,,b".split(",", -1)→["a", "", "b"]
limit = -1 是唯一能完整保留所有分割片段(含全空)的方式。
注意转义与特殊正则字符
split 接收的是正则表达式,不是普通字符串。常见错误:
- 想按点号
.分割,写成str.split(".")→ 实际匹配任意字符,结果几乎全拆开 - 正确写法是
str.split("\.")(Java 字符串需双反斜杠,正则中才表示字面量点) - 类似地,
|、*、+、?、[、]等都要转义 - 若只是分隔符是固定字符串,更安全的做法是用
Pattern.quote(delimiter)包裹
避免 null 或长度为 0 的异常场景
split 永远返回非 null 数组,但要注意:
-
null.split(...)会抛NullPointerException,调用前应判空 -
"".split(",")→ 返回长度为 1 的数组:[""](空字符串本身作为唯一元素) -
"".split(",", -1)→ 也是[""],不是空数组 - 若希望空字符串返回空数组,需手动判断并处理
不复杂但容易忽略。










