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