C++正则表达式需求:提取GUID后接字符的目标字符串
解决C++正则提取目标字符串的问题
我来帮你搞定这个正则匹配的问题!先看看你之前写的正则哪里出了问题,再给你正确的方案。
原正则的错误点
你之前的正则[0-9A-Fa-f{9}]+-[0-9A-Fa-f{4}]+-[0-9A-Fa-f{4}]+-[0-9A-Fa-f{4}]+-[0-9A-Fa-f{12}].*\$有两个关键问题:
- 字符类写法错误:
[0-9A-Fa-f{9}]这种写法会把{、9、}也当成可匹配的字符,而不是表示“匹配9个十六进制字符”。正确的写法应该是[0-9A-Fa-f]{8}(注意GUID第一部分是8位,不是9位哦),量词{n}要放在字符类外面。 - 结尾匹配不符合需求:
.*\$会匹配到字符串末尾,但你要提取的是两个\2分隔符之间的内容,不是到结尾的部分,所以这个限制完全没必要,反而会导致匹配错误。
正确的正则方案
根据你的目标字符串格式Ffs\2[目标内容]\2[其他].map,有两种可靠的匹配思路:
思路1:基于分隔符\2提取(最直接)
利用\2作为分隔符,提取两个分隔符之间的所有内容。在C++中,反斜杠需要双重转义,所以正则字符串可以用raw字符串简化写法:
R"(\\2([^\\]+)\\2)"
\\2:匹配分隔符\2(raw字符串里\\表示单个\,所以\\2对应原字符串的\2)([^\\]+):捕获组1,匹配任意非反斜杠的字符,直到遇到下一个\\2,正好就是你要的目标内容\\2:匹配第二个分隔符,确保我们只取中间的部分
思路2:结合GUID结构精确匹配(更严谨)
如果你想确保提取的内容是以标准GUID开头的,可以结合GUID的8-4-4-4-12十六进制格式来写正则:
R"(\\2([0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}[^\\]+)\\2)"
[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}:精确匹配标准GUID格式[^\\]+:匹配GUID后面的所有非反斜杠字符,直到下一个\\2
C++代码示例
这里给你一个完整的代码片段,演示如何使用正则提取目标内容:
#include <iostream> #include <regex> #include <string> int main() { std::string input = R"(Ffs\2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl\2FA2A6DA-11D5-4dc3-999A-749648B03C56.map)"; // 使用思路1的正则 std::regex re(R"(\\2([^\\]+)\\2)"); std::smatch match; if (std::regex_search(input, match, re)) { std::cout << "提取到的内容:" << match[1] << std::endl; } else { std::cout << "未匹配到目标内容" << std::endl; } return 0; }
运行这段代码会输出:提取到的内容:2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ayush Gupta
相关产品推荐
相关产品推荐

