C++ 正则表达式返回多项匹配结果

时间:2021-02-24 05:57:42

关于来到博客园

自去年个人域名催我第三次备案,所以一气之下,重新在godaddy买了域名和空间,重新搭建了博客,以为能得一方净土。但在预料之外的就是,我用的网通线路,80%时间都不能打开。近来也没心情重新打理,再者,独立博客显得过于孤独,所以来到了博客园。

今天给大家分享一下c++正则入门的心得

需要用到的几个头文件

#include <regex>  //我选择了std::tr1::regex 主要是vs2010集成
#include <string>
#include <fstream> //文件读取
#include <sstream> //stringstream,方式二,文件辅助读取
using namespace std;

 

我今天要做的就是匹配一个html(网易.htm,我已打包)文件中的所有图片,然后添加到listbox中。

GO的动作,实现方式一

sregex_token_iterator

CString strFile;
GetDlgItem(IDC_EDIT_HTML)->GetWindowText(strFile);//读取html文件名
//一次性读取 网易.htm 到strHtm中
ifstream file(strFile);
string strHtml;
strHtml.assign(istreambuf_iterator<char>(file.rdbuf()),istreambuf_iterator<char>());
file.close();

const std::tr1::regex pattern("http://[^\\\"\\>\\<]+?\\.(png|jpg|bmp)");//简单的匹配正则   const std::tr1::sregex_token_iterator end; for (std::tr1::sregex_token_iterator i(strHtml.begin(),strHtml.end(), pattern); i != end;++i) { //m_clbRegex.AddString((CString)(*i).str().c_str());//两种操作均可 m_clbRegex.AddString((CString)i->str().c_str());//m_clbRegex 为listbox的control变量 }

GO2的动作,实现方式二

 regex_search是返回单项匹配结果,所以我们需要循环多次匹配

    CString strFile;
    GetDlgItem(IDC_EDIT_HTML)->GetWindowText(strFile);

    ifstream file(strFile);
    string strHtml;
    stringstream ss;
    ss<<file.rdbuf();   
    file.close();
    strHtml=ss.str();//读取html文件到字符串

    std::regex_constants::syntax_option_type fl = std::regex_constants::icase;
    const std::tr1::regex pattern("http://[^\\\"\\>\\<]+?\\.(png|jpg|bmp)",fl); 
    std::tr1::smatch result;
    std::string::const_iterator itS = strHtml.begin();
std::string::const_iterator itE = strHtml.end(); while(regex_search(itS,itE, result, pattern))//如果匹配成功
{
//m_clbRegex.AddString((CString)result[0].str().c_str()); m_clbRegex.AddString((CString)(string(result[0].first,result[0].second)).c_str()); itS=result[0].second;//新的位置开始匹配 }

执行结果,GO,Go2效果一样

C++ 正则表达式返回多项匹配结果

示范源码:http://files.cnblogs.com/noevilme/CppHtmlRegex.rar