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遵循哪些规则?
对于奖励积分,是否有一个好方法(没有太多的复制/字符串追加)来获得我期待的分裂?
答案 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("")