为什么在空字符串上使用“split”会返回一个非空数组?

12 浏览
0 Comments

为什么在空字符串上使用“split”会返回一个非空数组?

使用空字符串分割,返回大小为1的数组:

scala> "".split(',')
res1: Array[String] = Array("")

注意,这会返回一个空数组:

scala> ",,,,".split(',')
res2: Array[String] = Array()

请解释一下 🙂

admin 更改状态以发布 2023年5月21日
0
0 Comments

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"

0
0 Comments

如果你不切橙子,那么你只有一个整个的橙子。

0