如何在没有扩展名的情况下获取文件名?例如,“test.html.erb”应为“test”
类似question。然而,
> File.basename("test.html.erb", ".*")
=> "test.html"
编辑:上面的代码是我尝试产生预期结果的失败。我知道我错误地使用File.basename。因此,我发布了这个问题。当我说没有扩展名的文件名时,我的意思是我不关心第一个点之后的东西。我想要返回的名字没有点。另外,在实际代码中,我将传递__FILE__
而不是"test.html.erb"
。
答案 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.basename
与File.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")