在Ruby中捕获绝对文件路径的一部分

在Ruby中捕获绝对文件路径的一部分,ruby,regex,Ruby,Regex,我正在编写一个解析文件名的类。我有三个问题: 正则表达式 给定hello/this/is/my/page.html我想捕获三个部分: 父文件夹:hello/this/is/my 文件名本身:页面 扩展名:.html 这是正则表达式:/^((?:[^\/]+\/)*)(\w+)(\.\w+)$/ 问题是,当我尝试这个(使用)时,当我使用相对路径文件(如page.html)时,它都被捕获到第一个捕获组中 有人能推荐一个适用于相对和绝对文件路径的正则表达式吗 班级 这个班可以吗 class Reg

我正在编写一个解析文件名的类。我有三个问题:

正则表达式 给定
hello/this/is/my/page.html
我想捕获三个部分:

  • 父文件夹:
    hello/this/is/my
  • 文件名本身:
    页面
  • 扩展名:
    .html
这是正则表达式:
/^((?:[^\/]+\/)*)(\w+)(\.\w+)$/

问题是,当我尝试这个(使用)时,当我使用相对路径文件(如
page.html
)时,它都被捕获到第一个捕获组中

有人能推荐一个适用于相对和绝对文件路径的正则表达式吗

班级 这个班可以吗

class RegexFilenameHelper
    filenameRegex = /^((?:[^\/]+\/)*)(\w+)(\.\w+)$/

    def self.getParentFolders(filePath)
        matchData = filenameRegex.match(filePath)
        return matchData[1]
    end

    def self.getFileName(filePath)
        # ...
    end

    def self.getFileExtension(filePath)
        # ...
    end
end
我知道为每个函数调用
.match
效率很低,但我不打算按顺序使用这三个函数。 我还打算调用类本身,而不是实例化对象

旁白 假设这一点很重要:您希望捕获
.html
还是
html
,原因是什么?

使用标准库: 正如Tim Pietzcker所建议的,该功能已经在路径名和文件类中实现

filepath=“hello/this/is/my/page.html”

  • 获取父项:
    File.dirname(filepath)
    =>“hello/this/is/my”
  • 获取名称:
    File.basename(文件路径)
    =>“page.html”
  • 不带扩展名:
    File.basename(filepath,File.extname(filepath))
    =>“页面”
  • 获取扩展名:
    File.extname(filepath)
    =>“.html”
我们调用类方法而不必实例化任何类,这正是我想要的

文件或文件夹实际上不必存在于文件系统中

谢谢Tim Pietzcker让我知道


使用正则表达式: 如果我想使用正则表达式,正确的正则表达式应该是
((?:^.*\/)?([^\/]+)(\..*$)

  • (((?:^.*\/)?)
    :捕获最后一个
    /
    之前的所有内容,或者什么都不捕获(这就是最后一个?的用途)。这是可选的父路径
  • ([^\/]+)
    :获取所有不是
    /
    的文件名
  • (\..*$)
    :捕获最后一个
    之后的所有内容,包括它
我试过这个,效果很好,但我仍然不确定第二个捕获组是否太宽,所以使用这个时要小心


感谢用户230910帮助我到达那里!:)

您确定要为此使用正则表达式吗?你是对的,这似乎是最好的解决办法:p。我将只获取我想要的函数并自己编译一个答案。这里有一个与路径匹配的正则表达式,扩展名分为两组:(\..*$)| ^.*/谢谢!但是我想匹配我提到的3个组,并且regex(虽然小而整洁)似乎也包括路径捕获中的扩展,我想…没关系,在Rubular中尝试过,并且完全按照你说的那样工作!编辑您的并获得了
((?:^.*\/)(\w+)(\..*$)
,我相信这就是我想要的。再次感谢!