将字符串分割成空子串

4
我得到了这个结果(请注意第一个""是前面的空匹配):
"babab".split("b")
# => ["", "a", "a"]

通过将输入中的 "a" 替换为空字符串,如下所示:
"bbb".split("b")

我希望能得到以下结果:
["", "", ""]

但实际上,我得到的是:
[]

这背后的逻辑是什么?

这里有一个很好的相关解释,对上面的内容非常有帮助,链接为 https://dev59.com/0WIj5IYBdhLWcg3wwHpr。 - ray
1
@ray:这个解释引用了相同的文档 :) - Sergio Tulentsev
@SergioTulentsev 是的,但你关于CSV的示例更多地是关于为什么而不是如何 :) - ray
1个回答

8

逻辑在这份文档中有描述:

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

尾随的空字段将被删除,但不会删除前导空字段。


如果你问的是“为什么 那样 呢?”,可以想象我们正在解析某些 CSV 文件。

fname,sname,id,email,status
,,1,sergio@example.com,

我们希望前两个位置保持为空,而不是被删除并使fname变成1,sname变成sergio@example.com。
我们不太关心尾随的空字段。无论删除还是保留,它们都不会改变数据的位置。

1
是的,文档还进一步解释说:如果为负数,则返回的字段数量没有限制,并且尾随的空字段不会被抑制。因此,split("b", -1) 将起作用。 - ray
@Sergio,我不是在询问前面的空字段,这一点我已经理解了。而且我之前也读过你引用的那部分内容,但是我的“尾随空字段”的解释可能与你的不同。我认为“null”指的是没有更多匹配项的地方,但实际上我并不确定,也许这是错误的。你能详细说明一下“尾随空字段”是什么吗? - sawa
好的,我想我明白了 "trailing null fields" 的含义。首先,"null" 应该被解释为空字符串。其次,"trailing" 应该意味着 "结果数组末尾的连续元素"。这份文档有误导性。 - sawa
1
@sawa:我认为他们指的是那些长度为零的空字符串,但在阅读了20分钟的Ruby、C和C++源代码后,我无法将其定位到一行代码。 - Sergio Tulentsev
1
@sawa:是的,这就是“trailing”的意思 :) - Sergio Tulentsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接