按字符拆分字符串

6

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个回答

5

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

查看具有字符参数的拆分函数(第206行)。

我认为,这里正在进行的一般模式是忽略所有尾随的空分割结果。

除了第一个之外,应用“如果未找到分隔符,则只发送整个字符串”的逻辑。

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

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


谢谢,我刚提交了一份文档拉取请求。 - Martijn

2

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

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

0

似乎符合以下三个规则:

1)去除末尾空的子字符串。

2)如果适用,空的子字符串被视为末尾而不是开头。

3)没有分隔符的第一个情况是例外。


空值?我当然希望不是这样。 - Martijn
请原谅我的笨拙用语。我想我可以说我是泛指的,但这样我又会犯错。零长度字符串。 - Bill Michaelson

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接