按字符

时间:2015-05-22 10:08:14

标签: string scala split

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会返回一个数组(数字一个分隔符出现)+ 1个元素,但显然不是这样。

它几乎就是上面的内容,但删除了所有尾随空字符串,但是对于拆分空字符串则不然。

我没有在这里找出模式。 StringOps.split遵循哪些规则?

对于奖励积分,是否有一个好方法(没有太多的复制/字符串追加)来获得我期待的分裂?

4 个答案:

答案 0 :(得分:4)

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

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

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

除了第一个,“如果没有找到分隔符char,则只发送整个字符串”逻辑正在应用。

我试图找出是否有围绕这些的设计文档。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

似乎与这三条规则一致:

1)删除空的子字符串。

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

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

答案 3 :(得分:0)

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

的行为

除了分隔符之外,它被分开,除了以下例外:

  • 无论如何,拆分空字符串将始终提供Array("")
  • 删除任何尾随的空子字符串
  • 如果匹配的字符不是代理项对的一部分,则代理字符仅匹配。