按字符拆分字符串
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("")
- 删除任何尾随的空子字符串
- 仅当匹配的字符不属于代理项对时,代理项字符才匹配。
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("")
- 删除任何尾随的空子字符串
- 仅当匹配的字符不属于代理项对时,代理项字符才匹配。