正则表达式匹配 C++ 中路径的一部分

Regex to match a part of a path in C++

提问人:LordBread 提问时间:11/16/2023 更新时间:11/16/2023 访问量:56

问:

我在尝试提出正则表达式以匹配路径的一部分,然后使用第二个捕获组提取它时遇到了问题

假设我们有以下路径:

./var/lib/

var/lib/

./var/lib

从这些示例中,我尝试匹配的字符串部分对于所有这些输入来说只是 (var/lib),所以我决定尝试使用正则表达式。

这是我目前所拥有的:

(\.\/)?[A-Za-z0-9][A-Za-z0-9\/]+(\/)?$

到目前为止,它与所有可能的方案匹配,但与最后一个捕获组不匹配。

因此,例如./var/lib/test/正确匹配,但是las /与第三个捕获组不匹配,但对于第二个捕获组,我不能匹配。

正确的行为应该是:

第一组 第二组 第三组
./ var/lib/test /
C++ 正则 表达式替换

评论

3赞 Some programmer dude 11/16/2023
您是否尝试过在 regex101 上进行实验?它可以向您显示有关正则表达式的大量信息,以帮助您找出问题所在。
7赞 Red.Wave 11/16/2023
XY问题?你试过std::filesystem::p ath吗?en.cppreference.com/w/cpp/filesystem/path 它具有多种便利功能,可让您摆脱大多数此类考虑。
0赞 Super-intelligent Shade 11/16/2023
(\.\/)?((\/?[A-Za-z0-9]+)+)(\/)?$它删除了重复项,但增加了一个额外的组。因此,您的第 3 组变成了第 4 组。A-Za-z0-9
0赞 Ted Lyngmo 11/16/2023
我同意@Red.Wave的观点。听起来正则表达式不是正确的工具 - 但很可能是。std::filesystem::path
1赞 Nick 11/16/2023
这回答了你的问题吗?我的正则表达式匹配太多。如何让它停止?

答:

2赞 Yksisarvinen 11/16/2023 #1

你只需要使用一个惰性量词而不是贪婪(此外,你错过了原始正则表达式中的第二组):+?+

(\.\/)?([A-Za-z0-9][A-Za-z0-9\/]+?)(\/)?$

惰性量词尽可能少地匹配,但由于您要求匹配包含字符串末尾 ,因此它别无选择,只能捕获除 last 之外的所有内容。$/

在 regex101
上在线查看 在 godbolt 上在线查看