按字符拆分字符串

split string by char

scala 在 StringOps.split

中有一个分割字符串的标准方法

虽然它的行为让我有些吃惊。

为了演示,使用快捷方便的功能

def sp(str: String) = str.split('.').toList

以下表达式的计算结果均为真

(sp("") == List("")) //expected
(sp(".") == List()) //I would have expected List("", "")
(sp("a.b") == List("a", "b")) //expected
(sp(".b") == List("", "b")) //expected
(sp("a.") == List("a")) //I would have expected List("a", "")
(sp("..") == List()) // I would have expected List("", "", "")
(sp(".a.") == List("", "a")) // I would have expected List("", "a", "")

所以我预计 split 会 return 一个包含(分隔符出现次数)+ 1 个元素的数组,但显然不是这样。

和上面差不多,只是去掉了所有尾随的空字符串,但是分割空字符串就不行了

我没能确定这里的模式。 StringOps.split 遵循什么规则?

对于奖励积分,是否有一个好的方法(没有太多 copying/string 附加)来获得我期望的拆分?

您可以将 split 与正则表达式一起使用。我不确定,但我猜第二个参数是结果数组的最大大小。

def sp(str: String) = str.split("\.", str.length+1).toList

好奇的你可以在这里找到代码。https://github.com/scala/scala/blob/v2.12.0-M1/src/library/scala/collection/immutable/StringLike.scala

查看以字符作为参数的 split 函数(第 206 行)。

我认为,这里发生的一般模式是,所有尾随的空拆分结果都被忽略了。

除了第一个,应用了 "if no separator char is found then just send the whole string" 逻辑。

我正在尝试查找是否有关于这些的任何设计文档。

此外,如果您使用字符串而不是字符作为分隔符,它将退回到 java 正则表达式拆分。正如@LRLucena 所提到的,如果您为 limit 参数提供的值大于 size,您将得到尾随的空结果。见 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String,%20int)

似乎符合这三个规则:

1) 删除尾随的空子字符串。

2) 如果适用,空子字符串在被视为前导之前被视为尾随。

3) 第一种情况,没有分隔符是例外。

split 遵循 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

的行为

即拆分"around"分隔符,以下情况除外:

  • 不管其他什么,拆分空字符串总是会得到 Array("")
  • 删除任何尾随的空子字符串
  • 仅当匹配的字符不属于代理项对时,代理项字符才匹配。