为什么对空字符串的“拆分”返回非空数组?解决方案 1:始终传递 -1 作为第二个参数解决方案2:使用番石榴分离器类
对空字符串进行拆分将返回大小为 1 的数组:
scala> "".split(',')
res1: Array[String] = Array("")
请考虑这将返回空数组:
scala> ",,,,".split(',')
res2: Array[String] = Array()
请解释:)
对空字符串进行拆分将返回大小为 1 的数组:
scala> "".split(',')
res1: Array[String] = Array("")
请考虑这将返回空数组:
scala> ",,,,".split(',')
res2: Array[String] = Array()
请解释:)
如果你把一个橙色零次分开,你正好有一块 - 橙色。
Java和Scala拆分方法分为两个步骤,如下所示:
",,,".split(",")
根据这个,由于第二步,结果应该是一个空数组,对吧?"".split(",")
它应该。不幸的是,这是一个人为引入的角落案例。这很糟糕,但至少它记录在 中,如果你记得看一下文档:java.util.regex.Pattern
对于 n == 0,结果为 n < 0,除了不会返回尾随的空字符串。(请注意,如上所述,输入本身为空字符串的情况是特殊的,并且 limit 参数不适用于此情况。
因此,我建议您始终作为第二个参数传递(这将跳过上面的第二步),除非您特别知道要实现的目标/您确定空字符串不是程序将作为输入的东西。n == -1
如果您已经在项目中使用番石榴,则可以尝试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"