让我说我有这个string ="C:/EFI/Ulta/Filename.rb"
而我试图只分裂"文件名"从它。
我尝试了string.split.last并返回" Filename.rb",我尝试删除" .rb"但drop方法对我不起作用。我还可以使用其他方法吗?
答案 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。