无法检索正则表达式匹配结果 - 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_match
的operator 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 字符串指针。
因此,您通过 %s
向 TRACE
承诺的内容(即原始 C 字符串 char*
指针)与您实际 之间存在不匹配 传递给它(即 match[0]
)。
根据 some online documentation,std::smatch
是 std::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());
我正在阅读 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_match
的operator 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 字符串指针。
因此,您通过 %s
向 TRACE
承诺的内容(即原始 C 字符串 char*
指针)与您实际 之间存在不匹配 传递给它(即 match[0]
)。
根据 some online documentation,std::smatch
是 std::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());