Ruby:获取没有扩展名的文件名

时间:2014-04-29 06:07:07

标签: ruby

如何在没有扩展名的情况下获取文件名?例如,“test.html.erb”应为“test”

类似question。然而,

> File.basename("test.html.erb", ".*")
=> "test.html" 

编辑:上面的代码是我尝试产生预期结果的失败。我知道我错误地使用File.basename。因此,我发布了这个问题。当我说没有扩展名的文件名时,我的意思是我不关心第一个点之后的东西。我想要返回的名字没有点。另外,在实际代码中,我将传递__FILE__而不是"test.html.erb"

9 个答案:

答案 0 :(得分:35)

阅读文档:

basename(file_name [, suffix] ) → base_name

  

返回file_name中给出的文件名的最后一个组件   可以使用File :: SEPARATOR和File :: ALT_SEPARATOR形成   File :: ALT_SEPARATOR不为nil时的分隔符。 如果给出后缀   并且出现在file_name的末尾,它将被删除。

=> File.basename('public/500.html', '.html')
=> "500"

在你的情况下:

=> File.basename("test.html.erb", ".html.erb")
=> "test"

答案 1 :(得分:19)

如果您不知道扩展程序,可以将File.basenameFile.extname合并:

filepath = "dir/dir/filename.extension"
File.basename(filepath, File.extname(filepath)) #=> "filename"

答案 2 :(得分:18)

Pathname提供了一个方便的面向对象的接口来处理文件名。

一种方法允许您用新的扩展替换现有扩展,并且该方法接受空字符串作为参数:

>> Pathname('foo.bar').sub_ext ''
=> #<Pathname:foo>
>> Pathname('foo.bar.baz').sub_ext ''
=> #<Pathname:foo.bar>
>> Pathname('foo').sub_ext ''
=> #<Pathname:foo>

这是一种方便的方法,可以将文件名剥离其扩展名(如果有的话)。

但是如果你想摆脱所有扩展,你可以使用正则表达式:

>> "foo.bar.baz".sub(/\..*/, '')
=> "foo"

答案 3 :(得分:17)

这个怎么样

File.basename(f, File.extname(f))

返回没有扩展名的文件名..适用于具有多个&#39;的文件名。&#39;在它。

答案 4 :(得分:6)

按点分割,第一部分就是你想要的。

filename = 'test.html.erb'
result = filename.split('.')[0]

答案 5 :(得分:2)

考虑到这个前提,对于这种情况最合适的答案(以及其他扩展的类似案例)将是这样的:

__FILE__.split('.')[0...-1].join('.')

只删除扩展程序(而不是名称的其他部分:myfile.html.erb此处变为myfile.html,而不仅仅是myfile

答案 6 :(得分:1)

name = "filename.100.jpg"
puts "#{name.split('.')[-1]}"

答案 7 :(得分:0)

感谢@xdazz和@Monk_Code的想法。如果其他人正在寻找,我使用的最终代码是:

File.basename(__FILE__, ".*").split('.')[0]

假设使用__FILE__并且结果字符串中没有句点,这通常允许您分别删除文件前后的路径和扩展名。

答案 8 :(得分:0)

但要了解它不是多平台解决方案,它适用于 unix:

def without_extensions(path)
    lastSlash = path.rindex('/')
    if lastSlash.nil?
        theFile = path
    else
        theFile = path[lastSlash+1..-1]
    end

    # not an easy thing to define
    # what an extension is
    theFile[0...theFile.index('.')]
end

puts without_extensions("test.html.erb")
puts without_extensions("/test.html.erb")
puts without_extensions("a.b/test.html.erb")
puts without_extensions("/a.b/test.html.erb")
puts without_extensions("c.d/a.b/test.html.erb")