拆分不会返回空字符串

时间:2016-02-15 16:51:13

标签: ruby split

有没有办法获得:

"[][][]".split('[]')
#=> ["", "", ""]

而不是

#=>[]

无需编写函数?

这种行为令人惊讶,因为有时候irb会按预期做出回应:

"[]a".split('[]')
#=>["", "a"]`

2 个答案:

答案 0 :(得分:6)

来自the docs

  

如果省略 limit 参数,则会抑制尾随空字段。如果 limit 是一个正数,则最多将返回该字段数(如果 limit 1,则整个字符串将作为唯一条目返回数组)。如果为负数,则返回的字段数没有限制,并且不会抑制尾随空字段。

所以:

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

这会产生四个空字符串,而不是你的三个字符串,但是如果你考虑它,这是唯一有意义的结果。如果你在每个逗号上拆分,,,,你也可以获得四个空字符串,因为在第一个逗号之前有一个空项,在最后一个之后有一个空白项。

答案 1 :(得分:2)

String#split有两个参数:一个pattern要拆分,一个limit表示返回的结果数。在这种情况下,limit可以帮助我们。

documentation for String#split说:

  

如果省略 limit 参数,则会抑制尾随空字段。如果 limit 是一个正数,则最多将返回该字段数(如果* limit(为1,整个字符串将作为数组中的唯一条目返回)。

这里的关键短语是尾随空字段被抑制,换句话说,如果你在字符串末尾有额外的空匹配,它们将从结果中删除,除非您已设置limit

以下是一个例子:

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

您可能希望获得["", "a", "", ""],但由于尾随空字段被抑制,所以在最后一次非空匹配(a)之后的所有内容都将被删除。

我们可以设置限制,只获得那么多结果:

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

在这种情况下,由于我们要求3个结果,因此忽略最后一个[]并构成最后结果的一部分。当我们知道我们期望得到多少结果时,这很有用,但在您的具体情况下却没那么有用。

幸运的是,文档继续:

  

如果为负数,则返回的字段数没有限制,并且不会抑制尾随空字段。

换句话说,我们可以通过-1的限制,并获得所有匹配,甚至是空尾的匹配:

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

所有匹配为空时,这甚至有效:

"[][][]".split('[]', -1)
#=> ["", "", "", ""]