Mar*_*ijn 5 string split scala
scala有一种分割字符串的标准方法 StringOps.split
但是这种行为让我感到有些惊讶.
为了演示,使用快速便利功能
def sp(str: String) = str.split('.').toList
Run Code Online (Sandbox Code Playgroud)
以下表达式都评估为true
(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", "")
Run Code Online (Sandbox Code Playgroud)
所以我期望拆分会返回一个数组(数字一个分隔符出现)+ 1个元素,但显然不是这种情况.
它几乎是上面的,但删除所有尾随的空字符串,但分裂空字符串不是这样.
我在这里没有确定模式.StringOps.split遵循哪些规则?
对于奖励积分,是否有一个好方法(没有太多的复制/字符串附加)来获得我期待的分裂?
出于好奇,您可以在这里找到代码。https://github.com/scala/scala/blob/v2.12.0-M1/src/library/scala/collection/immutable/StringLike.scala
请参阅以字符作为参数的 split 函数(第 206 行)。
我认为,这里发生的一般模式是,所有尾随的空分割结果都被忽略。
除了第一个之外,“如果没有找到分隔符,则仅发送整个字符串”逻辑正在被应用。
我正在尝试查找是否有有关这些的设计文档。
另外,如果您使用字符串而不是字符作为分隔符,它将回退到 java regex split。正如@LRLucena 所提到的,如果您提供的 limit 参数的值大于 size,您将得到尾随的空结果。请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String,%20int)