如何从Ruby中的文件路径中获取文件名?

例如,如果我有一个路径“C:\projects\blah.dll”,我只想要“blah”。

在Ruby中有LastIndexOf方法吗?


当前回答

如果你可以访问ENV变量,扫描结合这个小正则表达式(它可以找到倒数第二个单词,一个点,然后是字符串的最后一个单词),将文件的名称放在'filename'中:

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

显然,你可以在任何包含文件名的路径名上使用scan和regex,而__FILE__是明显的选择:

__FILE__.scan(/\w+\.\w+$/)

其他回答

如果你可以访问ENV变量,扫描结合这个小正则表达式(它可以找到倒数第二个单词,一个点,然后是字符串的最后一个单词),将文件的名称放在'filename'中:

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

显然,你可以在任何包含文件名的路径名上使用scan和regex,而__FILE__是明显的选择:

__FILE__.scan(/\w+\.\w+$/)

乔纳森·洛诺夫斯基(Jonathan Lonowski)回答得很完美,但这里没有一个答案提到。可以直接使用` . extname而不是File::extname。*'获取文件名。

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

但是,如果您想要获得任何特定扩展文件的基本文件名,那么您需要使用file::extname,否则不需要。

require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

我不是Windows用户很长时间了,但是Pathname rdoc说它在Windows上没有目录名称分隔符的问题。

试试这段代码

用extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 

注意双引号字符串转义。

'C:\projects\blah.dll'.split('\\').last