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

kon*_*yak 27 ruby

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

类似的问题.然而,

> File.basename("test.html.erb", ".*")
=> "test.html" 
Run Code Online (Sandbox Code Playgroud)

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

Зел*_*ный 37

阅读文档:

basename(file_name [, suffix] ) ? base_name

返回file_name中给出的文件名的最后一个组件,当File :: ALT_SEPARATOR不为nil时,可以使用File :: SEPARATOR和File :: ALT_SEPARATOR作为分隔符.如果给出后缀并出现在file_name的末尾,则将其删除.

=> File.basename('public/500.html', '.html')
=> "500"
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

=> File.basename("test.html.erb", ".html.erb")
=> "test"
Run Code Online (Sandbox Code Playgroud)


fgu*_*len 22

如果您不知道扩展名,可以File.basenameFile.extname以下内容结合使用:

filepath = "dir/dir/filename.extension"
File.basename(filepath, File.extname(filepath)) #=> "filename"
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于给定的用例:`.html.erb` (9认同)
  • @Hedgehog你是对的,但我确信我的解决方案可以帮助很多可以来到这里的人为我寻求更通用解决方案的问题的标题所吸引. (2认同)

and*_*otn 20

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

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

>> Pathname('foo.bar').sub_ext ''
=> #<Pathname:foo>
>> Pathname('foo.bar.baz').sub_ext ''
=> #<Pathname:foo.bar>
>> Pathname('foo').sub_ext ''
=> #<Pathname:foo>
Run Code Online (Sandbox Code Playgroud)

这是一种方便的方法来获取文件名被剥离的扩展名(如果有的话).

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

>> "foo.bar.baz".sub(/\..*/, '')
=> "foo"
Run Code Online (Sandbox Code Playgroud)


don*_*ajd 18

这个怎么样

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

返回没有扩展名的文件名..适用于具有多个'.'的文件名.在里面.


xda*_*azz 6

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

filename = 'test.html.erb'
result = filename.split('.')[0]
Run Code Online (Sandbox Code Playgroud)


kon*_*yak 2

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

File.basename(__FILE__, ".*").split('.')[0]
Run Code Online (Sandbox Code Playgroud)

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