8

可能重复:
Ruby 中的拆分问题

在 Ruby 中,当我使用与字符串开头匹配的分隔符拆分字符串时,它会在数组的初始位置给出一个空字符串:

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

但是当我使用匹配字符串结尾的分隔符做类似的事情时,它不会给出一个空字符串:

"abc".split(/c/) # => ["ab"]

这在我看来不一致。这种规范有什么理由吗?

编辑 如果它要与 Perl 的规范兼容,就像 muu 中的简短回答一样,那么问题仍然是一样的:为什么在 Perl 中会这样?也正因如此,现在它也变成了关于 Perl 的问题。

4

2 回答 2

9

来自精美手册

split(pattern=$;, [limit]) → anArray
[...]
如果省略了limit参数,则会抑制尾随的空字段。如果limit是一个正数,最多将返回该数量的字段(如果limit为 1,则整个字符串作为数组中的唯一条目返回)。如果为负数,则返回的字段数没有限制,并且不抑制尾随的空字段。

所以尾随的“空字段”被抑制,因为文档说它们是。如果您想要尾随的空字符串,请要求它:

'abc'.split(/c/, -1) # [ 'ab', '' ]

为什么会这样?可能是因为它符合Perl 的split行为:

如果LIMIT为负数,则将其视为任意大;产生尽可能多的字段。

我们看到,使用负数limit再次给了我们尾随的空字符串:

$ perl -e 'print join(",", split(/c/, "abc")), "\n"'
ab
$ perl -e 'print join(",", split(/c/, "abc", -1)), "\n"'
ab,

为什么要复制 Perl 的行为?问马茨。

于 2012-11-07T16:37:19.390 回答
4

在阅读了 AWK 的 mu is too short 之后的规范后,我开始觉得 AWK 的初衷split是提取与字段对应的子字符串,每个字段都以标点符号结尾,例如,.分隔符被认为是“字段结束字符”。目的不是将字符串对称地拆分为每个分隔符位置的左侧和右侧,而是在分隔符位置的左侧终止子字符串。在这个概念下,在分隔符的左侧总是有一些字符串(即使它是空的)是有意义的,但不一定在分隔符的右侧。这可能是通过 Perl 继承给 Ruby 的。

于 2012-11-07T20:13:06.190 回答