2016-02-11 53 views
2

我正在阅读一个HTML页面,并试图检索其中的特定字符串。无法检索正则表达式匹配结果 - MFC/C++

我有以下代码:

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 '˜ò' 

我想打印/存储中找到的匹配的结果,但我得到一些垃圾代替。

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

+0

对于这样的示例代码,只是把字符串中的代码,而不是调用的' test.GetString()'。这样就很清楚正在搜索什么。 –

+0

我不能把整个HTML ...它太长了 – Rana

+0

好吧,但尝试并放入一个较短的字符串,显示问题。 –

回答

3
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字符串指针。

所以,你有(即原始C字符串指针char*)之间您通过%s答应TRACE什么不匹配,你是什么实际上传递给它(即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] code):难怪打印的文本是没有意义的。

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

为此,您可以调用std::sub_match's str() method。这返回一个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()); 
+0

哇,这是完美的答案!我现在完全理解,我想拥抱你!非常感谢你做的这些! – Rana

+0

@Rana:你非常欢迎。很高兴帮助。 –

+0

只是想知道,我可以告诉'TRACE'期待一个'std :: string'吗?而不是'%s' – Rana

2

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

​​

也就是说,用sub_matchoperator string()得到(临时)C++字符串对象,然后调用其成员函数c_str()来获取(临时)C字符串对象。

+0

完美!它的工作原理!谢谢! – Rana

+0

尽管它有效,但我不确定发生了什么。请多解释一下? – Rana

+0

我在调试器中检查了'match [0]'的值,它的值为'157'。这代表什么,对象ID号码? – Rana