无法检索正则表达式匹配结果 - MFC/C++

Unable to retrieve regex match results - MFC / C++

我正在阅读 HTML 页面并尝试检索其中的特定字符串。

我有以下代码:

    std::string str = test.GetString(); // someString ( the string i have checked it, it's basically an html page )
    std::smatch match;
    std::regex re("0x(\d|[A-Z]).*0000"); // the pattern I'm searching for
    if (std::regex_search(str, match, re)){
        test = "found"; // found gets printed
    }
    TRACE("%s\n",match[0]); // this outputs some garbage like this '˜ò'

我想 print/store 找到匹配的结果,但我得到了一些垃圾。

免责声明:我是 C++ 正则表达式的新手。我可能犯了一个基本错误

这里的问题是match[0] returns一个sub_match类型的对象,它只是一对迭代器。如果 TRACE 宏的第一个参数是 C 风格的格式说明符,则将 sub_match 对象转换为 C 字符串,如下所示:

TRACE("%s\n", std::string(match[0]).c_str());

即用sub_matchoperator string()得到一个(临时的)C++字符串对象,然后调用它的成员函数c_str()得到一个(临时的)C++字符串对象字符串对象。

std::smatch match;
...
TRACE("%s\n",match[0]); // this outputs some garbage like this '˜ò'

TRACE 宏中的 %s 类型说明符需要一个 原始 C 字符串指针 (char* 在 ANSI/MBCS 构建中;wchar_t* 在 Unicode 构建中 - 我假设您正在此处进行 ANSI/MBCS 构建。)。

但是 match[0] 不是 原始 C 字符串指针。

因此,您通过 %sTRACE 承诺的内容(即原始 C 字符串 char* 指针)与您实际 之间存在不匹配 传递给它(即 match[0])。

根据 some online documentationstd::smatchstd::match_results 模板的特化,特别是:

smatch --> match_results<string::const_iterator>

smatch::operator[](您在代码中调用的 match[0]returns a reference to another object,即 std::sub_match。 这个std::sub_match class表示一对迭代器,表示匹配字符的序列。

因此,您 承诺 TRACE 传递原始 C 字符串指针(通过 %s 类型说明符),但实际上您传递的是完全不同的东西,即对 std::sub_match 对象的引用(通过您的 match[0] 代码):难怪打印的文本毫无意义。

你要做的是从match[0]表达式中获取一个C字符串指针。

为此,您可以调用 std::sub_match's str() method。这个returns一个std::string对象。

然而,这个 std::string 对象 不是 %s 所期望的:事实上,%s 表示原始 C 字符串指针(例如 const char*),不是 std::string 实例。

所以,最后一步是从 std::string 对象中提取这个原始 C 字符串指针,这是通过调用 std::string::c_str() method.

来完成的

总结这些逻辑步骤:

std::smatch match;
...
match[0]               --> reference to std::sub_match object
match[0].str()         --> std::string object
match[0].str().c_str() --> raw C string pointer (const char*)

因此,您的 TRACE 语句可以写成:

TRACE("%s\n", match[0].str().c_str());