提问人:LordBread 提问时间:11/16/2023 更新时间:11/16/2023 访问量:56
正则表达式匹配 C++ 中路径的一部分
Regex to match a part of a path in C++
问:
我在尝试提出正则表达式以匹配路径的一部分,然后使用第二个捕获组提取它时遇到了问题
假设我们有以下路径:
./var/lib/
var/lib/
./var/lib
从这些示例中,我尝试匹配的字符串部分对于所有这些输入来说只是 (var/lib),所以我决定尝试使用正则表达式。
这是我目前所拥有的:
(\.\/)?[A-Za-z0-9][A-Za-z0-9\/]+(\/)?$
到目前为止,它与所有可能的方案匹配,但与最后一个捕获组不匹配。
因此,例如./var/lib/test/正确匹配,但是las /与第三个捕获组不匹配,但对于第二个捕获组,我不能匹配。
正确的行为应该是:
第一组 | 第二组 | 第三组 |
---|---|---|
./ | var/lib/test | / |
答:
2赞
Yksisarvinen
11/16/2023
#1
你只需要使用一个惰性量词而不是贪婪(此外,你错过了原始正则表达式中的第二组):+?
+
(\.\/)?([A-Za-z0-9][A-Za-z0-9\/]+?)(\/)?$
惰性量词尽可能少地匹配,但由于您要求匹配包含字符串末尾 ,因此它别无选择,只能捕获除 last 之外的所有内容。$
/
评论
std::filesystem::p ath
吗?en.cppreference.com/w/cpp/filesystem/path 它具有多种便利功能,可让您摆脱大多数此类考虑。(\.\/)?((\/?[A-Za-z0-9]+)+)(\/)?$
它删除了重复项,但增加了一个额外的组。因此,您的第 3 组变成了第 4 组。A-Za-z0-9
std::filesystem::path