【问题标题】:How to get the name of file without extension? [duplicate]如何获取没有扩展名的文件名? [复制]
【发布时间】:2014-08-26 14:52:06
【问题描述】:

假设我有这个string ="C:/EFI/Ulta/Filename.rb",我试图从中只拆分“文件名”。

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

【问题讨论】:

  • 无法复制。 string.split.last 返回"C:/EFI/Ulta/Filename.rb"
  • 我是想写string.split("/").last
  • File#basename 最好,但这应该可以工作:"C:/EFI/Ulta/File...name.rb"[/(?:.*\/)?(.+)\.?/,1] => "File...name"。如果文件名前面有正斜杠,则非捕获组(?:.*\/) 会吞噬所有字符,直到最后一个正斜杠。 ? 允许文件名位于字符串的开头。如果至少有一个点,则捕获组 (#1) (.+) 会消耗直到最后一个点的所有字符。 ? 允许没有文件名后缀的可能性。 ,1 检索捕获组 1 的内容。

标签: ruby string split


【解决方案1】:
f = "C:/EFI/Ulta/Filename.rb"
File.basename(f,File.extname(f))
#=> "Filename" 

How to get filename without extension from file path in Ruby

【讨论】:

    【解决方案2】:

    当您对文件扩展名没有任何特定偏好时,您可以使用以下技巧。它以 100% 的信心运行。

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

    djsmentya 答案的唯一区别 是,我没有使用File::extname 方法。至少按照 OP 的示例,我认为没有必要使用 ::extname 方法。

    【讨论】:

    • 这被否决了。我很想知道为什么。
    【解决方案3】:
    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。

    【讨论】:

    • 而且,确实,已修复。 :)
    • 尽管当 File 以一种经过充分测试和尝试的真实方式为您执行此操作(具有额外的好处)时,这只是一个字符串操作的练习。
    • 我喜欢字符串操作练习。
    【解决方案4】:

    如果你正在处理文件,你可以使用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 路径和带有多个点的文件名。

    【讨论】:

    • 这里的边缘情况是"my.long.filename.with.full.stops.rb"
    • @AFaderDarkly 我创建了另一个解决方案来解决您发现的问题。
    • 那个正则表达式灼伤了我的眼睛! path.match 也返回 nil,这在 match.size 步骤中失败。当然这只是一个简单的错字,但我不打算调试那个正则表达式......;)
    • @AFaderDarkly 该示例正在运行。
    • 我相信你可能已经落入了我落入的陷阱,并且无法捕获没有扩展名的文件名。他们在 match.size 上失败并出现相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2014-02-07
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多