我有一个正则表达式,用于从HTML页面中删除额外的vml标记。
std::string regstr = R"(<!\[if !vml\]>([\s\S]*?)<!\[endif\]>)";
std::regex regex(regstr, std::regex_constants::ECMAScript);
std::smatch mr;
std::string str = R"(</v:shape><![endif]--><![if !vml]>
<img width=234 height=383 src="file:///C:\Users\jcyangzh\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" v:shapes="110x110">
<![endif]></span></span><span lang=EN-US><o:p></o:p></span></p>)";
if (std::regex_search(str, mr, regex)) {
std::cout << "match found: " << mr.size() << "\n";
for (size_t i = 0; i < mr.size(); ++i) {
std::string strrep = mr.str(i);
std::cout << "index: " << i << "\n string: " << strrep << "\n\n";
}
}
对于GNU GCC编译器4.9.2(最新的tdm-gcc Windows端口),上面的代码可以正常工作。我使用的正则表达式匹配。
但是对于Visual Studio 2013 Update 4,正则表达式不起作用,std::regex_search
返回false
。
如果我将关键模式[\s\S]
替换为(\s|\S)
,则会有 3 匹配。
[\s\S]
是有效的C ++ 11 Ecma正则表达式,还是这是VS2013 Update 4的错误?