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

olu*_*ies 100 java scala

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

scala> "".split(',')
res1: Array[String] = Array("")
Run Code Online (Sandbox Code Playgroud)

请考虑这返回空数组:

scala> ",,,,".split(',')
res2: Array[String] = Array()
Run Code Online (Sandbox Code Playgroud)

请解释 :)

Sam*_*sby 67

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

  • 这个比喻对于"橙色".split(',')`有意义,但对于拆分空字符串显然不相关.如果我将缺少橙色零次分开,我仍然没有橙色; 我们把它表示为一个没有橙子的空列表,一个没有橙色的列表,一个十二个没有橙子的列表,或者什么?这不是我们最终得到的问题,而是我们如何代表它. (28认同)
  • 但是橙色并不是空的(如果那是多数意味着它的意思),它是橙色的.也许分裂应该在那里的橙色,但不是,所以你得到一个单一的值:一个空的空间xD (8认同)
  • 这是一次深刻的对话. (7认同)
  • 但如果你把一本不存在的书按页分开,你将一无所获。 (2认同)

Rok*_*alj 41

Java和Scala拆分方法分两步运行,如下所示:

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

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

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

对于n == 0,结果与n <0相同,但不会返回尾随空字符串.(注意,输入本身是空字符串的情况是特殊的,如上所述,并且limit参数不适用于那里.)

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

所以,我建议你总是n == -1作为第二个参数传递(这将跳过上面的第二步),除非你明确知道你想要实现什么/你确定空字符串不是你的程序将作为输入得到的东西.

解决方案2:使用Guava Splitter类

如果您已在项目中使用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"
Run Code Online (Sandbox Code Playgroud)

  • +1,这是唯一实际引用文档并指出它不一致的答案。但是,我没有在我的 JavaDoc 中找到注释中突出显示的部分。 (2认同)

Nic*_*ndo 40

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

  • 错误。拆分会删除所有最右边的空字符串,因此结果应该是一个空数组。看我的答案。`“,”。split(“,”)`返回空数组。 (2认同)

Dan*_*ral 32

出于同样的原因

",test" split ','
Run Code Online (Sandbox Code Playgroud)

",test," split ','
Run Code Online (Sandbox Code Playgroud)

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

  • @ DanielC.Sobral好的,为什么`","拆分","`返回一个0的数组? (10认同)
  • @Raphael,用任何其他编程语言`"".split("wtf").length`返回0.仅在JS中它是1.:/ (7认同)
  • @Raphael或在Oracle数据库中 (5认同)
  • 空字符串是一个字符串,而不是什么.(除Excel之外的任何地方) (4认同)
  • 为什么不是最后一场比赛后的一切都归还了? (4认同)

web*_*rjn 22

"a".split(",")- > "a" 因此 "".split(",")- >""

  • 错误.拆分删除所有最右边的空字符串,因此结果应该是一个空数组.看我的回答.`",".split(",")`返回空数组. (5认同)

bre*_*777 5

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