如何获取不带扩展名的文件名?例如,输入
"/dir1/dir2/test.html.erb"
应返回 "test"
。
在实际代码中,我将传入
__FILE__
而不是 "/dir1/dir2/test.html.erb"
。
阅读文档:
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"
这个怎么样
File.basename(f, File.extname(f))
返回不带扩展名的文件名。适用于具有多个“.”的文件名在里面。
如果您不知道扩展名,可以将
File.basename
与 File.extname
结合使用:
filepath = "dir/dir/filename.extension"
File.basename(filepath, File.extname(filepath)) #=> "filename"
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
按点分割,第一部分就是你想要的。
filename = 'test.html.erb'
result = filename.split('.')[0]
考虑到前提,对于这种情况(以及具有其他扩展的类似情况)最合适的答案将是这样的:
__FILE__.split('.')[0...-1].join('.')
这只会删除扩展名(而不是名称的其他部分:
myfile.html.erb
这里变成myfile.html
,而不仅仅是myfile
。
感谢@xdazz 和@Monk_Code 的想法。如果其他人正在寻找,我使用的最终代码是:
File.basename(__FILE__, ".*").split('.')[0]
这通常允许您删除文件前面的完整路径和后面的扩展名,仅给出文件名,不带任何点或斜杠。
name = "filename.100.jpg"
puts "#{name.split('.')[-1]}"
然而,了解它不是一个多平台解决方案,它适用于 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")
如果您想要一个删除扩展名的咒语,无论扩展名是什么,并且您知道扩展名中只有一个点,例如
.html
,请用 splat 指定所有可能的扩展名:
filepath = "dir/dir/filename.extension"
File.basename(filepath, '.*') # => "filename"