从String#split返回零长度字符串

时间:2012-06-27 20:20:26

标签: ruby

在Ruby 1.9.3(可能是早期版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法给了我一定的结果。我得到的结果似乎与我期望的相反。这是一个例子:

"abcabc".split("b") #=> ["a", "ca", "c"]
"abcabc".split("a") #=> ["", "bc", "bc"]
"abcabc".split("c") #=> ["ab", "ab"]

这里,第一个示例正好返回我期望的内容。

但在第二个例子中,我很困惑为什么#split返回一个零长度字符串作为返回数组的第一个值。这是什么原因?这就是我所期望的:

"abcabc".split("a") #=> ["bc", "bc"]

在同一行中,为什么第三个例子中没有返回拖尾的零长度字符串?如果第二个示例返回一个零长度字符串作为它的第一个值,那么最后一个示例应该返回与它的最后一个值相同的值。

启发我,我在这里失踪了什么?

编辑:仔细研究一下,我意识到为什么这是默认行为以及为什么我的想法完全错误。例如,如果我们要浏览一个CSV文件,在每一列上拆分,我们的数据就会被抛弃,因为空的前导列会被忽略。

同样重要的是要注意这个问题与Ruby无关 - 我知道许多其他语言的行为完全相同。当我得知这个时,我只是简单地使用Ruby。

2 个答案:

答案 0 :(得分:5)

ruby 1.9 documentation

  

如果省略limit参数,则禁止尾随空字段。

所以如果我们举个例子:

 "abcabc".split("a") #=> ["bc", "bc"]

我们包含一个限制值:

 "abcabc".split("a", -1)  #=> ["ab", "ab", ""]

你得到了预期的行为。

答案 1 :(得分:4)

"abcabc".split("b") #=> ["a", "ca", "c"]
"abcabc".split("a") #=> ["", "bc", "bc"]
"abcabc".split("c") #=> ["ab", "ab"]

假设您正在分割逗号。你期望从什么样的行为 ",bc,bc".split(',')?分裂'a'并没有什么不同。对于第三个示例,split默认省略了尾随空白。