You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:25:24