为什么在空字符串上使用“split”会返回一个非空数组?
为什么在空字符串上使用“split”会返回一个非空数组?
使用空字符串分割,返回大小为1的数组:
scala> "".split(',') res1: Array[String] = Array("")
注意,这会返回一个空数组:
scala> ",,,,".split(',') res2: Array[String] = Array()
请解释一下 🙂
admin 更改状态以发布 2023年5月21日
Java和Scala的split方法分两步执行:
- 首先,按分隔符拆分字符串。自然的结果是,如果字符串不包含分隔符,则返回一个只包含输入字符串的单元素数组,
- 其次,移除所有最右边的空字符串。这就是为什么
",,,".split(",")
返回一个空数组的原因。
根据这个,"".split(",")
的结果应该是一个空数组,因为第二步的缘故,对吗?
应该是的。不幸的是,这是一个人为引入的特例情况。这很糟糕,但至少在java.util.regex.Pattern
的文档中有记录,如果你记得查看文档:
对于n==0,结果就像n<0一样,只是不返回尾部的空字符串。(请注意,输入本身为空字符串的情况是特殊的,如上所述,限制参数在那里不适用。)
解决方案1:始终将-1作为第二个参数传递
因此,我建议您始终将n == -1
作为第二个参数传递(这将跳过上面的第二步),除非您特别知道要实现什么/您确定空字符串不是您的程序要输入的内容。
解决方案2:使用Guava Splitter类
如果您已经在项目中使用Guava,可以尝试Splitter(文档)类。它有一个非常丰富的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"