为什么对空字符串的“拆分”返回非空数组?解决方案 1:始终传递 -1 作为第二个参数解决方案2:使用番石榴分离器类

2022-08-31 08:26:16

对空字符串进行拆分将返回大小为 1 的数组:

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

请考虑这将返回空数组:

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

请解释:)


答案 1

如果你把一个橙色零次分开,你正好有一块 - 橙色。


答案 2

Java和Scala拆分方法分为两个步骤,如下所示:

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

根据这个,由于第二步,结果应该是一个空数组,对吧?"".split(",")

它应该。不幸的是,这是一个人为引入的角落案例。这很糟糕,但至少它记录在 中,如果你记得看一下文档:java.util.regex.Pattern

对于 n == 0,结果为 n < 0,除了不会返回尾随的空字符串。(请注意,如上所述,输入本身为空字符串的情况是特殊的,并且 limit 参数不适用于此情况。

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

因此,我建议您始终作为第二个参数传递(这将跳过上面的第二步),除非您特别知道要实现的目标/您确定空字符串不是程序将作为输入的东西。n == -1

解决方案2:使用番石榴分离器类

如果您已经在项目中使用番石榴,则可以尝试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"

推荐