在Ruby中拆分空白空间

时间:2014-03-11 11:05:36

标签: ruby regex

在Ruby和JavaScript中,我都可以编写表达式" x ".split(/[ ]+/) 。在JavaScript中,我得到了一些合理的结果["", "x", ""],但在Ruby(2.0.0)中,我得到["", "x"],这对我来说非常违反直觉。我有问题要理解正则表达式在Ruby中是如何工作的。为什么我没有获得与JavaScript相同的结果,或只是["x"]

2 个答案:

答案 0 :(得分:10)

来自string#split documentation,强调我自己:

  

split(pattern = $;,[limit])

     

如果pattern是String,则在拆分str时将其内容用作分隔符。如果pattern是单个空格,则str在空格上分割,前导空格和连续空格字符的运行被忽略。

     

如果pattern是Regexp,则str在模式匹配的位置被划分。只要模式匹配零长度字符串,str就会分成单个字符。如果pattern包含组,则相应的匹配也将在数组中返回。

     

如果省略pattern,则值为$;用来。如果$;是nil(这是默认值),str在空格上分割,好像`'被指定。

     

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

因此,如果您使用" x ".split(/[ ]+/, -1),您的预期结果将为["", "x", ""]

*编辑以反映Wayne的评论

答案 1 :(得分:10)

我在String#split的C代码中发现了这一点,几乎就在最后:

if (NIL_P(limit) && lim == 0) {
long len;
while ((len = RARRAY_LEN(result)) > 0 &&
       (tmp = RARRAY_AREF(result, len-1), RSTRING_LEN(tmp) == 0))
    rb_ary_pop(result);
}

所以实际上pop返回结果数组末尾的空字符串!看起来Ruby的创建者并不希望String#split返回一堆空字符串。

请注意NIL_P(limit)的检查 - 这与文档所说的完全一致,正如@dax指出的那样。