Answers:
出于同样的原因
",test" split ','
和
",test," split ','
将返回一个大小为2的数组。将第一个匹配之前的所有内容作为第一个元素返回。
"".split("wtf").length
返回0。仅在JS中为1::/
"," split ","
返回一个0数组呢?
如果将橙子零次拆分,则只有一块-橙子。
"orange".split(',')
,但显然与拆分空字符串无关。如果我将缺橙次数分成零次,则仍然没有橙。我们是将其表示为空的无橙列表,正好是一个无橙列表,十二个无橙列表还是什么?这不是我们最终得到什么的问题,而是我们如何表示它。
Java和Scala拆分方法按以下两个步骤操作:
",,,".split(",")
返回空数组的原因。据此,"".split(",")
由于第二步,的结果应该是一个空数组,对吧?
这应该。不幸的是,这是人为引入的角壳。这是不好的,但至少它是记录中java.util.regex.Pattern
,如果你还记得看看文档,:
对于n == 0,结果与n <0相同,只是不返回结尾的空字符串。(请注意,如上所述,输入本身为空字符串的情况很特殊,并且limit参数不适用于该情况。)
因此,我建议您始终n == -1
作为第二个参数传递(这将跳过上面的第二步),除非您特别知道要实现的目标/您确定空字符串不是您的程序将获得的输入内容。
如果您已经在项目中使用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"
"".split (",", n)
使用Oracle JDK 8为(-1,0,1)中的n生成一个单元素数组。很高兴只获得一个非空标记的列表-猜想可能需要一个完整的正则表达式(类似"[^,\\s]+[^,]*[^,\\s]*"
)。
在所有编程语言中,我知道空白字符串仍然是有效的String。因此,使用任何定界符进行拆分将始终返回单个元素数组,其中该元素为空白String。如果它是一个空(不是空白)字符串,那将是另一个问题。
不管split
是好是坏,此行为都是从Java继承的
。Scala不会覆盖String
原语中的定义。
注意,您可以使用limit
参数来修改行为:
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行为令人困惑,但是:
从至少Java 5到Java 8可以观察到上述行为。
在JDK-6559590中拆分空字符串时,尝试更改行为以返回空数组。但是,当它在各个地方引起回归时,很快就在JDK-8028321中对其进行了还原。所做的更改永远不会使它成为Java 8的初始发行版。
注意:split方法从一开始就不在Java中使用(不在1.0.2中),但实际上至少从1.4开始存在(例如,参见2002年的JSR51)。我仍在调查...
尚不清楚的是,为什么Java首先选择了此选项(我怀疑它最初是“边缘案例”中的一个疏忽/错误),但是现在不可撤销地融入了该语言,因此仍然存在。
"".split(",")
仍会返回单个元素数组,例如[""]
。
空字符串在拆分字符串时没有特殊状态。您可以使用:
Some(str)
.filter(_ != "")
.map(_.split(","))
.getOrElse(Array())