为什么在空字符串上“拆分”会返回非空数组?

时间:2011-02-11 00:50:58

标签: java scala

在空字符串上拆分会返回一个大小为1的数组:

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

考虑这会返回空数组:

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

请解释:)

8 个答案:

答案 0 :(得分:62)

如果将橙色分成零次,则只有一个橙色。

答案 1 :(得分:40)

拆分空字符串会返回空字符串作为第一个元素。如果在目标字符串中找不到分隔符,则将获得一个大小为1的数组,该数组包含原始字符串,即使它是空的。

答案 2 :(得分:35)

Java和Scala拆分方法分两步运行:

  • 首先,用分隔符拆分字符串。自然的结果是,如果字符串不包含分隔符,则返回仅包含输入字符串的单例数组,
  • 其次,删除所有最右边的空字符串。这就是",,,".split(",")返回空数组的原因。

根据这个,"".split(",")的结果应该是一个空数组,因为第二步,对吗?

它应该。不幸的是,这是一个人为引入的极端案例。这很糟糕,但至少在<{1}}中记录 ,如果您还记得查看文档:

  

对于n == 0,结果与n&lt; 0,除了尾随空字符串   将不予退还。 (注意输入本身就是一个例子   空字符串是特殊的,如上所述,和limit参数   不适用于那里。)

解决方案1:始终将-1作为第二个参数

传递

所以,我建议你总是将java.util.regex.Pattern作为第二个参数传递(这将跳过上面的第二步),除非你明确知道你想要实现什么/你确定空字符串不是那个你的程序将作为输入。

解决方案2:使用Guava Splitter类

如果您已在项目中使用Guava,则可以尝试Splitter (documentation)课程。它有一个非常丰富的API,使您的代码非常容易理解。

n == -1

答案 3 :(得分:31)

出于同样的原因

",test" split ','

",test," split ','

将返回一个大小为2的数组。第一个匹配之前的所有内容都将作为第一个元素返回。

答案 4 :(得分:23)

"a".split(",") - &gt; "a" 因此 "".split(",") - &gt; ""

答案 5 :(得分:4)

在所有编程语言中,我知道空字符串仍然是有效的字符串。因此,使用任何分隔符进行拆分将始终返回单个元素数组,其中该元素是空字符串。如果它是一个null(非空白)字符串,那么这将是一个不同的问题。

答案 6 :(得分:2)

这种split行为继承自Java,无论好坏...... Scala不会覆盖String原语的定义。

请注意,您可以use the limit argument to modify the behavior

  

limit参数控制模式的应用次数,因此会影响结果数组的长度。如果限制n大于零,则模式最多应用n - 1次,数组的长度不大于n,并且数组的最后一个条目将包含超出最后匹配的分隔符。如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。

即。您可以设置limit=-1以获取(所有?)其他语言的行为:

@ ",a,,b,,".split(",")
res1: Array[String] = Array("", "a", "", "b")

@ ",a,,b,,".split(",", -1)  // limit=-1
res2: Array[String] = Array("", "a", "", "b", "", "")

似乎众所周知Java行为是quite confusing但是:

  

从至少Java 5到Java 8可以观察到上述行为。

     

JDK-6559590中拆分空字符串时,尝试更改行为以返回空数组。但是,当它在各个地方引起回归时很快就会在JDK-8028321中恢复。这一变化从未进入最初的Java 8版本。

注意:拆分方法从一开始就不是Java(它是not in 1.0.2),但实际上至少有1.4(例如参见JSR51大约2002)。我还在调查......

目前还不清楚为什么Java首先选择了这个(我怀疑它最初是一个&#34;边缘案例中的疏忽/错误&#34;),但现在已经不可逆转地融入了语言所以it remains

答案 7 :(得分:0)

空字符串在拆分字符串时没有特殊状态。您可以使用:

C:\Program Files\Java\jdk1.x.y.z