Ruby`String#split`方法的结果

时间:2015-09-23 14:22:51

标签: ruby string split

我无法解释此代码的行为:

str="../tests/sls_79.sexp"
str.split(".") # => ["", "", "/tests/sls_79", "sexp"]

第一个元素", "来自哪里?为什么这样的逗号?

3 个答案:

答案 0 :(得分:3)

因为你的字符串以两个句点(“..”)

开头
 "../".split(".")
 => ["", "", "/"]

尝试:

str="../tests/sls_79.sexp"
str.split(/\.+/) #=> ["", "", "/tests/sls_79", "sexp"]
 => ["", "/tests/sls_79", "sexp"] 

答案 1 :(得分:0)

以下是split方法的工作原理。拿你的字符串:

str = "../tests/sls_79.sexp"

使用点分隔符"。"进行拆分,将查找字符串并找到分隔符。由于之前没有任何内容split将插入第一个子字符串,这是一个空字符串。

split_result = [""]

继续前进,会出现另一个句点,并且在此次出现与前一个出现之间没有任何内容,因此split会为该数组创建另一个空子字符串。

split_result = ["", ""]

第三次发生在" 9"之后,产生一个" / tests / sls_79"的子串。

split_result = ["", "", "/tests/sls_79"]  

最后,剩下的子字符串将被添加为返回数组的最后一个元素。

split_result = ["", "", "/tests/sls_79", "sexp"]      

答案 2 :(得分:0)

您寻求的信息全部在the split documentation

  

split(pattern=$;, [limit]) → anArray

     

将str分为基于分隔符的子串,返回这些子串的数组。

     

[...]

     

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

     

当输入str为空时,返回一个空数组,因为该字符串被认为没有要拆分的字段。

根据该信息,split将这些视为空字符串并返回空数组,因为没有其他内容可以返回:

'.'.split('.')  # => []
'..'.split('.') # => []

如果要返回某些内容,split会将字符串分解为数组中为了反映找到的分隔符所需的空元素,然后返回子字符串:

'..foo'.split('.')    # => ["", "", "foo"]
'.foo.foo'.split('.') # => ["", "foo", "foo"]

那时,你得到的结果应该是有道理的:

str = '../tests/sls_79.sexp'
str.split('.') # => ["", "", "/tests/sls_79", "sexp"]

而且,为了彻底,根据文档,通常修剪空的尾随元素。 -1告诉split保留尾随的空元素:

'.foo.'.split('.')     # => ["", "foo"]
'.foo.'.split('.', -1) # => ["", "foo", ""]

但是等等!实际上有更好的方法来做你想做的事情,使用设计用于处理文件名的方法!

我们可以split到目录和filename.ext的文件路径,或者只提取目录,只提取文件的基本名称或文件的扩展名:

File.split(str)    # => ["../tests", "sls_79.sexp"]
File.dirname(str)  # => "../tests"
File.basename(str) # => "sls_79.sexp"
File.extname(str)  # => ".sexp"

最后,这里是如何获得没有扩展名的文件名:

File.basename(str, File.extname(str)) # => "sls_79"

或者您可以使用:

File.basename(str, '.*') # => "sls_79"

有关详细信息,请参阅File文档。