Ruby:获取不带扩展名的文件名

问题描述 投票:0回答:10

如何获取不带扩展名的文件名?例如,输入

"/dir1/dir2/test.html.erb"
应返回
"test"

在实际代码中,我将传入

__FILE__
而不是
"/dir1/dir2/test.html.erb"

ruby
10个回答
66
投票

阅读文档:

basename(file_name [, suffix] ) → base_name

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

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

在你的情况下:

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

38
投票

这个怎么样

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

返回不带扩展名的文件名。适用于具有多个“.”的文件名在里面。


30
投票

如果您不知道扩展名,可以将

File.basename
File.extname
结合使用:

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

26
投票

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"

请注意,这仅适用于裸文件名,不适用于像

foo.bar/pepe.baz
这样的路径。为此,您不妨使用一个函数:

def without_extensions(path)
  p = Pathname(path)
  p.parent / p.basename.sub(
    /
      (?<=.) # look-behind: ensure some character, e.g., for ‘.foo’
      \. # literal ‘.’
      .* # extensions
    /x, '')
end

9
投票

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

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

2
投票

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

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

这只会删除扩展名(而不是名称的其他部分:

myfile.html.erb
这里变成
myfile.html
,而不仅仅是
myfile


2
投票

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

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

这通常允许您删除文件前面的完整路径和后面的扩展名,仅给出文件名,不带任何点或斜杠。


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

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")

0
投票

如果您想要一个删除扩展名的咒语,无论扩展名是什么,并且您知道扩展名中只有一个点,例如

.html
,请用 splat 指定所有可能的扩展名:

filepath = "dir/dir/filename.extension"
File.basename(filepath, '.*') # => "filename"
© www.soinside.com 2019 - 2024. All rights reserved.