在空字符串上拆分会返回一个大小为1的数组:
scala> "".split(',')
res1: Array[String] = Array("")
考虑这会返回空数组:
scala> ",,,,".split(',')
res2: Array[String] = Array()
请解释:)
答案 0 :(得分:62)
如果将橙色分成零次,则只有一个橙色。
答案 1 :(得分:40)
拆分空字符串会返回空字符串作为第一个元素。如果在目标字符串中找不到分隔符,则将获得一个大小为1的数组,该数组包含原始字符串,即使它是空的。
答案 2 :(得分:35)
Java和Scala拆分方法分两步运行:
",,,".split(",")
返回空数组的原因。根据这个,"".split(",")
的结果应该是一个空数组,因为第二步,对吗?
它应该。不幸的是,这是一个人为引入的极端案例。这很糟糕,但至少在<{1}}中记录 ,如果您还记得查看文档:
对于n == 0,结果与n&lt; 0,除了尾随空字符串 将不予退还。 (注意输入本身就是一个例子 空字符串是特殊的,如上所述,和limit参数 不适用于那里。)
所以,我建议你总是将java.util.regex.Pattern
作为第二个参数传递(这将跳过上面的第二步),除非你明确知道你想要实现什么/你确定空字符串不是那个你的程序将作为输入。
如果您已在项目中使用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