有没有办法获得:
"[][][]".split('[]')
#=> ["", "", ""]
而不是
#=>[]
无需编写函数?
这种行为令人惊讶,因为有时候irb会按预期做出回应:
"[]a".split('[]')
#=>["", "a"]`
答案 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)
#=> ["", "", "", ""]