以下格式

时间:2018-04-20 12:56:32

标签: c++ regex

我需要为c ++ regex

编写以下格式的正则表达式
Ffs\\2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl\\2FA2A6DA-11D5-4dc3-999A-749648B03C56.map

这里我需要获取字符串

2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl 

表示GUID后跟字符

我正在尝试这个但是没有用

[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}].*\\$

请提供您的建议。

1 个答案:

答案 0 :(得分:1)

您可以使用

std::regex rx("[0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12}([^\\\\]*)")

请参阅regex demo。基本上,在删除+量词的同时将限制量词移到字符类之外,然后确保\被正确转义(在非原始字符串文字\\\\中),最后匹配任何0使用\构造的[^\\]*以外的其他字符。

<强>详情

  • [0-9A-Fa-f]{8} - 8个十六进制字符
  • (?:-[0-9A-Fa-f]{4}){3} - 使用-
  • 分隔出3次出现的4个十六进制字符
  • - - 连字符
  • [0-9A-Fa-f]{12} - 12个十六进制字符
  • ([^\\]*) - 第1组:除\以外的任何0 +字符。

C++ demo

#include <iostream>
#include <regex>
#include <string>
using namespace std;

int main() {
    regex rex1("[0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12}([^\\\\]*)");
    string s("Ffs\\2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl\\2FA2A6DA-11D5-4dc3-999A-749648B03C56.map");
    smatch m;
    if (regex_search(s, m, rex1)) {
        std::cout << "Whole match: " << m[0] << std::endl;
        std::cout << "PiSmmIpl value: " << m[1] << std::endl;
    }
    return 0;
}

输出:

Whole match: 2FA2A6DA-11D5-4dc3-999A-749648B03C56PiSmmIpl
PiSmmIpl value: PiSmmIpl