如何获取没有扩展名的文件名?

时间:2014-08-26 14:52:06

标签: ruby string split

让我说我有这个string ="C:/EFI/Ulta/Filename.rb"而我试图只分裂"文件名"从它。

我尝试了string.split.last并返回" Filename.rb",我尝试删除" .rb"但drop方法对我不起作用。我还可以使用其他方法吗?

4 个答案:

答案 0 :(得分:5)

f = "C:/EFI/Ulta/Filename.rb"
File.basename(f,File.extname(f))
#=> "Filename" 

How to get filename without extension from file path in Ruby

答案 1 :(得分:1)

如果您没有关于文件扩展名的任何特定偏好设置,则可以使用以下技巧。它100%有信心。

string ="C:/EFI/Ulta/Filename.rb"
File.basename(string, ".*") # => "Filename"

唯一带有djsmentya答案的差异是,我没有使用File::extname方法。至少根据OP的例子,我认为没有必要使用::extname方法。

答案 2 :(得分:0)

如果您正在处理文件,可以使用basename

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

否则,如果它只是一个字符串:

'C:/EFI/Ulta/Filename.rb'.split('/').last.split('.').first

修改

如果您希望通用解决方案仅基于字符串操作,则可以使用此方法:

path = 'C:\file\path\to\file.rb'
match = match = path.match(/^.*(\\|\/)(.+(\\|\/))*(.+)(\.(.+))*$/)
filename = match.values_at(match.size-2)

这将适用于unix和windows路径和带有多个点的文件名。

答案 3 :(得分:0)

path = 'C:/EFI/Ulta/Filename.rb'

def filename_from_path(path)
  parts = path.split('/').last.split('.')
  (parts.size > 1 ? parts[0..-2] : parts).join('.')
end

filename_from_path(path)

应该这样做。

示例:

filename_from_path('C:/EFI/Ulta/Filename.rb')
# => "Filename" 

filename_from_path('C:/EFI/Ulta/Filen.ame.rb')
# => "Filen.ame" 

filename_from_path('C:/EFI/Ulta/Filenamerb')
# => "Filenamerb" 

虽然正确的方法可能是根据其他答案使用File.basename。