我无法解释此代码的行为:
str="../tests/sls_79.sexp"
str.split(".") # => ["", "", "/tests/sls_79", "sexp"]
第一个元素", "
来自哪里?为什么这样的逗号?
答案 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文档。