ruby中的string.split方法对我来说很有趣

时间:2010-04-19 12:23:37

标签: ruby string

txt = "1aaa5"

然后

txt.split("a")在ruby 1.9中产生[1,“”,“”,5]。有谁能解释为什么?特别是,为什么不[1,5]?感谢。

6 个答案:

答案 0 :(得分:10)

因为它在每个“a”

的实例上被拆分
  1. 1aaa5分为1和aa5
  2. aa5分为“”和a5
  3. a5分为“”和5
  4. 所以,1,“”,“”,5

    使用/ a + /或“aaa”代替

    irb(main):002:0> txt.split(/a+/)
    => ["1", "5"]
    

答案 1 :(得分:3)

因为你的分隔符是一个而且Ruby无法猜测你不想要空条目。考虑一下您的示例,但用逗号替换a字符。

txt = "1,,,5"

在我的世界中,我可能会认为中间两个列的4列值为零。我当然不希望它删除空条目,因为如果没有4,我不知道哪些应该是零。

因为无法猜测,它会返回数组中的空“字段”和非空“字段”。如果你需要它来省略空的“字段”,请使用@ S.Mark的解决方案。

答案 2 :(得分:2)

你所看到的行为是有道理的。当您致电string.split("a")时,您说“使用'a'作为分隔符”,并在分隔符之间为我提供一系列值。在txt中的第一个“a”和第二个“a”之间,该值为空字符串;同样适用于第二个和第三个“a”之间的值。这就是你看到[1, "", "", 5]

的原因

就好像txt是1,,,5而你选择','作为分隔符。如果有人询问列表中的值是什么:

  1. 1
  2. 5

答案 3 :(得分:2)

当您致电split时,您正在传递一个分隔符,该分隔符本质上会在分割时从字符串中删除。

举例来说:

s = ",foo"

当你打电话给s.split(",")时,你说“把逗号左侧的所有内容放入它自己的数组条目中,然后把逗号右边的所有内容放入下一个条目,忽略逗号本身“。该函数将“逗号左侧的所有内容”视为"",而不是任何内容。

所以你的字符串遵循以下模式:

1aaa5
1, aa5
1, '', a5
1, '', '', 5

这解释了为什么有两个空字符串,而不仅仅是[1,5]

答案 4 :(得分:0)

您的分隔符“a”存在3次。尝试拆分“aaa”。

答案 5 :(得分:0)

如果未指定要拆分的模式,则拆分空格上的拆分。所以,除了其他解决方案,你可以做到

txt = "1aaa5"
txt.gsub('a',' ').split
=>[1, 5]

(如果文本不包含相关的空格)。