在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”
- 获取父项:
=>“hello/this/is/my”File.dirname(filepath)
- 获取名称:
=>“page.html”File.basename(文件路径)
- 不带扩展名:
=>“页面”File.basename(filepath,File.extname(filepath))
- 获取扩展名:
=>“.html”File.extname(filepath)
使用正则表达式: 如果我想使用正则表达式,正确的正则表达式应该是
((?:^.*\/)?([^\/]+)(\..*$)
:捕获最后一个(((?:^.*\/)?)
之前的所有内容,或者什么都不捕获(这就是最后一个?的用途)。这是可选的父路径/
:获取所有不是([^\/]+)
的文件名/
:捕获最后一个(\..*$)
之后的所有内容,包括它
感谢用户230910帮助我到达那里!:) 您确定要为此使用正则表达式吗?你是对的,这似乎是最好的解决办法:p。我将只获取我想要的函数并自己编译一个答案。这里有一个与路径匹配的正则表达式,扩展名分为两组:(\..*$)| ^.*/谢谢!但是我想匹配我提到的3个组,并且regex(虽然小而整洁)似乎也包括路径捕获中的扩展,我想…没关系,在Rubular中尝试过,并且完全按照你说的那样工作!编辑您的并获得了
((?:^.*\/)(\w+)(\..*$)
,我相信这就是我想要的。再次感谢!