5

在 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。

4

2 回答 2

5

ruby 1.9 文档

如果省略了 limit 参数,则会抑制尾随的空字段。

因此,如果我们以您为例:

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

我们包括一个极限值:

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

你得到了预期的行为。

于 2012-06-27T20:38:10.913 回答
4
"abcabc".split("b") #=> ["a", "ca", "c"]
"abcabc".split("a") #=> ["", "bc", "bc"]
"abcabc".split("c") #=> ["ab", "ab"]

假设你用逗号分开。你会期待什么样的行为 ",bc,bc".split(',')?在“a”上拆分没有什么不同。对于第三个示例,split默认情况下省略尾随空。

于 2012-06-27T20:36:47.490 回答