Java 和 Scala 的拆分方法分两步操作,如下所示:
- 首先,用分隔符分割字符串。自然的结果是,如果字符串不包含分隔符,则返回一个只包含输入字符串的单例数组,
- 其次,删除所有最右边的空字符串。这就是
",,,".split(",")返回空数组的原因。
按照这个,"".split(",")的结果应该是一个空数组,因为第二步吧?
应该。不幸的是,这是一个人为引入的极端案例。这很糟糕,但至少它记录在java.util.regex.Pattern,如果你记得看一下文档:
对于 n == 0,结果与 n (请注意,输入本身就是一个
空字符串是特殊的,如上所述,还有limit参数
不适用于那里。)
解决方案 1:始终将 -1 作为第二个参数传递
所以,我建议您始终将n == -1 作为第二个参数传递(这将跳过上面的第二步),除非您明确知道要实现什么/您确定空字符串不是您的程序将作为输入。
解决方案 2:使用 Guava Splitter 类
如果您已经在项目中使用 Guava,可以尝试 Splitter (documentation) 类。它有一个非常丰富的 API,让你的代码很容易理解。
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"