青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

http://www.cppprog.com/2009/0116/53_3.html

注意使用Boost.Regex需要預先編譯

完整編譯請參考本站編譯Boost的文章
如果只要編譯Regex庫,有兩種方法(參考鏈接):
  1. 在Boost根目錄下運行bjam --toolset=<編譯器名> --with-regex 其它參數
  2. <boost>\libs egex\build里,找到對應編譯器的makefile,然后make -f xxxx.mak

使用

Boost.Regex手里有七種武器和兩****寶
其中的七種武器是:
regex_match 函數
regex_search 函數
regex_replace 函數
regex_format 函數
regex_grep 函數
regex_split 函數
RegEx 類
每種武器都又有諸多變化(每個函數都分別以C字符串類型std::string類型、迭代器類型作為參數重載),不過后面四種武器因年久失修已不建議使用.
兩****寶是:
regex_iterator 迭代器
regex_token_iterator 迭代器
這兩****寶是整個Boost.Regex的靈魂,用熟它們以后那是“摘花飛葉即可傷人”啊~~

回到正題,下面邊寫邊學。

所需頭文件:

#include <boost/regex.hpp>
 

示例代碼:

先準備一個測試用的數據備用,如果各位有雅興可以參考本站的另一篇文章《Google Testing》使用Google Testing框架來做這個實驗,花一樣時間學兩樣啊~~
  1. #include <iostream>
  2. #include <boost/regex.hpp>
  3.  
  4. using namespace std;
  5. int main(int argc, char* argv[])
  6. {    //( 1 )   ((  3  )  2 )((  5 )4)(    6    )   
  7.     //(\w+)://((\w+\.)*\w+)((/\w*)*)(/\w+\.\w+)?
  8.     //^協議://網址(x.x...x)/路徑(n個\字串)/網頁文件(xxx.xxx)
  9.     const char *szReg = "(\\w+)://((\\w+\\.)*\\w+)((/\\w*)*)(/\\w+\\.\\w+)?";
  10.     const char *szStr = "http://www.cppprog.com/2009/0112/48.html";
  11.  
  12.     //練習代碼...
  13.    
  14.    
  15.     cin.get(); //暫停
  16. }

1.字符串匹配

要確定一行字符串是否與指定的正則表達式匹配,使用regex_match。
下面這個代碼可以驗證szStr字串(定義在上面)是否與szReg匹配。
  1. {    //字符串匹配
  2.     boost::regex reg( szReg );
  3.     bool r=boost::regex_match( szStr , reg);
  4.     assert(r); //是否匹配
  5. }

boost::regex的構造函數中還可以加入標記參數用于指定它的行為,如:
  1. //指定使用perl語法(默認),忽略大小寫。
  2. boost::regex reg1( szReg, boost::regex::perl|boost::regex::icase );
  3. //指定使用POSIX擴展語法(其實也差不多)
  4. boost::regex reg2( szReg, boost::regex::extended );


下面這個代碼不僅驗證是否匹配,而且可以從中提取出正則表達式括號對應的子串。
  1. {    //提取子串
  2.     boost::cmatch mat;
  3.     boost::regex reg( szStr );
  4.     bool r=boost::regex_match( szStr, mat, reg);
  5.     if(r) //如果匹配成功
  6.     {
  7.         //顯示所有子串
  8.         for(boost::cmatch::iterator itr=mat.begin(); itr!=mat.end(); ++itr)
  9.         {
  10.             //       指向子串對應首位置        指向子串對應尾位置          子串內容
  11.             cout << itr->first-szStr << ' ' << itr->second-szStr << ' ' << *itr << endl;
  12.         }
  13.     }
  14.     //也可直接取指定位置信息
  15.     if(mat[4].matched) cout << "Path is" << mat[4] << endl;
  16. }

其中,boost::cmatch是一個針對C字符串的特化版本,它還有另三位兄弟,如下:
typedef match_results<const char*> cmatch;
typedef match_results<std::string::const_iterator> smatch;
typedef match_results<const wchar_t*> wcmatch;
typedef match_results<std::wstring::const_iterator> wsmatch;

可以把match_results看成是一個sub_match的容器,同時它還提供了format方法來代替regex_format函數。
一個sub_match就是一個子串,它從std::pair<BidiIterator, BidiIterator>繼承而來,這個迭代器pair里的firstsecond分別指向了這個子串開始和結尾所在位置。同時,sub_match又提供了str(),length()方法來返回整個子串。
 

2.查找字符串

regex_match只驗證是否完全匹配,如果想從一大串字符串里找出匹配的一小段字符串(比如從網頁文件里找超鏈接),這時就要使用regex_search了。
下面這段代碼從szStr中找數字
  1. //查找
  2.     boost::cmatch mat;
  3.     boost::regex reg( "\\d+" );    //查找字符串里的數字
  4.     if(boost::regex_search(szStr, mat, reg))
  5.     {
  6.         cout << "searched:" << mat[0] << endl;
  7.     }
  8. }
 

3.替換

regex_replace提供了簡便的方法來部分替換源字符串
正則表達式中,使用$1~$9\1~\9)表示第幾個子串,$&表示整個串,$`表示第一個串,$'表示最后未處理的串。
  1. //替換1,把上面的HTTP的URL轉成FTP的
  2.     boost::regex reg( szReg );
  3.     string s = boost::regex_replace( string(szStr), reg, "ftp://$2$5");
  4.     cout << "ftp site:"<< s << endl;
  5. }

正則表達式中,使用(?1~?9新字串)表示把第幾個子串替換成新字串,其中是S1()代表一個字串,S2的(?1)代表替換哪個字串,?0代表所有都要加上后面的字符串?1代表第一個替換成的字符串
  1. //替換2,使用format_all參數把<>&全部轉換成網頁字符
  2.     string s1 = "(<)|(>)|(&)";
  3.     string s2 = "(?1&lt;)(?2&gt;)(?3&amp;)";
  4.     boost::regex reg( s1 );
  5.     string s = boost::regex_replace( string("cout << a&b << endl;"), reg, s2, boost::match_default | boost::format_all);
  6.     cout << "HTML:"<< s << endl;
  7. }

 

4.使用regex_iterator查找

    對應于C字符串和C++字符串以及寬字符,regex_iterator同樣也有四個特化:
    typedef regex_iterator<const char*> cregex_iterator;
    typedef regex_iterator<std::string::const_iterator> sregex_iterator;
    typedef regex_iterator<const wchar_t*> wcregex_iterator;
    typedef regex_iterator<std::wstring::const_iterator> wsregex_iterator;

    這個迭代器的value_type定義是一個match_results。
  1. //使用迭代器找出所有數字
  2.     boost::regex reg( "\\d+" );    //查找字符串里的數字
  3.     boost::cregex_iterator itrBegin(szStr, szStr+strlen(szStr), reg);
  4.     boost::cregex_iterator itrEnd;
  5.     for(boost::cregex_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  6.     {
  7.             //       指向子串對應首位置        指向子串對應尾位置          子串內容
  8.             cout << (*itr)[0].first-szStr << ' ' << (*itr)[0].second-szStr << ' ' << *itr << endl;
  9.     }
  10. }

    Boost.Regex也提供了make_regex_iterator函數簡化regex_iterator的構造,如上面的itrBegin可以寫成:
itrBegin = make_regex_iterator(szStr,reg);
 

5.使用regex_token_iterator拆分字符串

    它同樣也有四個特化,形式和上面類似,就不再寫一遍騙篇幅了。
    這個迭代器的value_type定義是一個sub_match。
  1. //使用迭代器拆分字符串
  2.     boost::regex reg("/");  //按/符拆分字符串
  3.     boost::cregex_token_iterator itrBegin(szStr, szStr+strlen(szStr), reg,-1);
  4.     boost::cregex_token_iterator itrEnd;
  5.     for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  6.     {
  7.         cout << *itr << endl;
  8.     }
  9. }

    Boost.Regex也提供了make_regex_token_iterator函數簡化regex_token_iterator的構造,最后的那個參數-1表示以reg為分隔標志拆分字符串,如果不是-1則表示取第幾個子串,并且可以使用數組來表示同時要取幾個子串,例如:
  1. //使用迭代器拆分字符串2
  2.     boost::regex reg("(.)/(.)");  //取/的前一字符和后一字符(這個字符串形象貌似有點邪惡-_-)
  3.     int subs[] = {1,2};        // 第一子串和第二子串
  4.     boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,subs); //使用-1參數時拆分,使用其它數字時表示取第幾個子串,可使用數組取多個串
  5.     boost::cregex_token_iterator itrEnd;
  6.     for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  7.     {
  8.         cout << *itr << endl;
  9.     }
  10. }

完整測試代碼:

  1. #include <iostream>
  2. #include <boost/regex.hpp>
  3.  
  4. using namespace std;
  5. int main(int argc, char* argv[])
  6. {    //( 1 )   ((  3  )  2 )((  5 )4)(    6    )   
  7.     //(\w+)://((\w+\.)*\w+)((/\w*)*)(/\w+\.\w+)?
  8.     //^協議://網址(x.x...x)/路徑(n個\字串)/網頁文件(xxx.xxx)
  9.     const char *szReg = "(\\w+)://((\\w+\\.)*\\w+)((/\\w*)*)(/\\w+\\.\\w+)?";
  10.     const char *szStr = "http://www.cppprog.com/2009/0112/48.html";
  11.  
  12.     {    //字符串匹配
  13.         boost::regex reg( szReg );
  14.         bool r=boost::regex_match( szStr , reg);
  15.         assert(r);
  16.     }
  17.  
  18.     {    //提取子串
  19.         boost::cmatch mat;
  20.         boost::regex reg( szReg );
  21.         bool r=boost::regex_match( szStr, mat, reg);
  22.         if(r) //如果匹配成功
  23.         {
  24.             //顯示所有子串
  25.             for(boost::cmatch::iterator itr=mat.begin(); itr!=mat.end(); ++itr)
  26.             {
  27.                 //       指向子串對應首位置        指向子串對應尾位置          子串內容
  28.                 cout << itr->first-szStr << ' ' << itr->second-szStr << ' ' << *itr << endl;
  29.             }
  30.         }
  31.         //也可直接取指定位置信息
  32.         if(mat[4].matched) cout << "Path is" << mat[4] << endl;
  33.     }
  34.  
  35.     { //查找
  36.         boost::cmatch mat;
  37.         boost::regex reg( "\\d+" );    //查找字符串里的數字
  38.         if(boost::regex_search(szStr, mat, reg))
  39.         {
  40.             cout << "searched:" << mat[0] << endl;
  41.         }
  42.     }
  43.  
  44.     { //替換
  45.         boost::regex reg( szReg );
  46.         string s = boost::regex_replace( string(szStr), reg, "ftp://$2$5");
  47.         cout << "ftp site:"<< s << endl;
  48.     }
  49.     { //替換2,把<>&轉換成網頁字符
  50.         string s1 = "(<)|(>)|(&)";
  51.         string s2 = "(?1&lt;)(?2&gt;)(?3&amp;)";
  52.         boost::regex reg( s1 );
  53.         string s = boost::regex_replace( string("cout << a&b << endl;"), reg, s2, boost::match_default | boost::format_all);
  54.         cout << "HTML:"<< s << endl;
  55.     }
  56.  
  57.     { //使用迭代器找出所有數字
  58.         boost::regex reg( "\\d+" );    //查找字符串里的數字
  59.         boost::cregex_iterator itrBegin = make_regex_iterator(szStr,reg); //(szStr, szStr+strlen(szStr), reg);
  60.         boost::cregex_iterator itrEnd;
  61.         for(boost::cregex_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  62.         {
  63.                 //       指向子串對應首位置        指向子串對應尾位置          子串內容
  64.                 cout << (*itr)[0].first-szStr << ' ' << (*itr)[0].second-szStr << ' ' << *itr << endl;
  65.         }
  66.     }
  67.  
  68.     { //使用迭代器拆分字符串
  69.         boost::regex reg("/");  //按/符拆分字符串
  70.         boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,-1); //使用-1參數時拆分,使用其它數字時表示取第幾個子串,可使用數組取多個串
  71.         boost::cregex_token_iterator itrEnd;
  72.         for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  73.         {
  74.             cout << *itr << endl;
  75.         }
  76.     }
  77.  
  78.     { //使用迭代器拆分字符串2
  79.         boost::regex reg("(.)/(.)");  //取/的前一字符和后一字符(這個字符串形象貌似有點邪惡-_-)
  80.         int subs[] = {1,2};        // 第一子串和第二子串
  81.         boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,subs); //使用-1參數時拆分,使用其它數字時表示取第幾個子串,可使用數組取多個串
  82.         boost::cregex_token_iterator itrEnd;
  83.         for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
  84.         {
  85.             cout << *itr << endl;
  86.         }
  87.     }
  88.  
  89.  
  90.     cin.get();
  91.     return 0;
  92. }

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线精品一区| 亚洲综合精品一区二区| 亚洲国语精品自产拍在线观看| 欧美三级特黄| 欧美精品videossex性护士| 蜜乳av另类精品一区二区| 久久亚洲欧美| 免费亚洲一区| 欧美视频不卡| 国产在线国偷精品产拍免费yy| 国产婷婷97碰碰久久人人蜜臀| 国产一区二区三区高清| 亚洲第一网站免费视频| 亚洲精品一区二区在线观看| 一本久久精品一区二区| 欧美一级黄色录像| 久久久五月天| 亚洲人成网站色ww在线| 亚洲看片免费| 欧美一区二区三区视频在线观看 | 亚洲精品一二三区| 一区二区三区四区在线| 久久精品网址| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美国产日韩天堂区| 欧美亚洲视频一区二区| 免费在线观看一区二区| 欧美精品在线极品| 国产精品r级在线| 国一区二区在线观看| 亚洲美洲欧洲综合国产一区| 欧美一区成人| 亚洲国产人成综合网站| 午夜性色一区二区三区免费视频| 欧美ed2k| 激情综合网激情| 亚洲一区二区黄色| 欧美国产三级| 欧美在线视频全部完| 欧美日韩亚洲一区二区三区| 精品不卡一区| 久久不见久久见免费视频1| 欧美丰满高潮xxxx喷水动漫| 亚洲免费在线| 欧美午夜寂寞影院| 亚洲免费大片| 91久久嫩草影院一区二区| 久久精品视频在线播放| 国产精品丝袜久久久久久app| 亚洲精品国产精品国产自| 裸体一区二区| 久久精品亚洲精品| 国内外成人在线| 欧美自拍偷拍午夜视频| 亚洲一区二区三区在线视频| 欧美日韩亚洲精品内裤| 一本色道久久综合亚洲精品小说 | 99精品久久免费看蜜臀剧情介绍| 久久人人97超碰人人澡爱香蕉 | 亚洲日本aⅴ片在线观看香蕉| 久久久久久自在自线| 亚洲欧美久久久| 国产区日韩欧美| 久久激情五月婷婷| 亚洲欧美另类在线观看| 国产精品美女黄网| 欧美亚洲一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 欧美日韩一区二区视频在线观看| 99re热这里只有精品免费视频| 亚洲国产色一区| 欧美日韩免费一区二区三区| 一区二区三区国产盗摄| 一区二区三区四区国产精品| 欧美性一二三区| 欧美主播一区二区三区| 久久黄色小说| 亚洲欧洲日韩综合二区| 亚洲精品一区二区三区99| 欧美日本一道本| 欧美肥婆在线| 国产农村妇女毛片精品久久莱园子 | 亚洲视频观看| 亚洲男人的天堂在线aⅴ视频| 国产亚洲视频在线观看| 暖暖成人免费视频| 欧美日韩不卡在线| 欧美一区二区黄| 久久婷婷麻豆| 亚洲香蕉网站| 久久精品国产免费| 99精品热视频| 久久精品国产精品亚洲精品| 亚洲精选中文字幕| 欧美一级成年大片在线观看| 亚洲国产导航| 亚洲午夜在线| 亚洲国产高清高潮精品美女| 日韩一级精品视频在线观看| 国产日韩在线亚洲字幕中文| 亚洲第一精品影视| 国产伦精品一区二区三区| 欧美激情精品久久久久| 国产精品蜜臀在线观看| 欧美风情在线| 国产亚洲欧美激情| 亚洲乱码国产乱码精品精天堂 | 欧美一区亚洲| 中文无字幕一区二区三区| 久久国产精品高清| 亚洲欧美国产高清| 欧美高清hd18日本| 美脚丝袜一区二区三区在线观看 | 国产精品对白刺激久久久| 免费观看久久久4p| 国产精品网站在线观看| 亚洲人成网站精品片在线观看| 国产一区二区在线免费观看| 亚洲日本电影在线| 在线观看亚洲一区| 欧美一区二区免费| 欧美在线视频日韩| 欧美性一区二区| 日韩视频在线免费观看| 亚洲经典在线| 每日更新成人在线视频| 六月婷婷久久| 国产一区二区三区视频在线观看| 日韩午夜在线播放| 日韩亚洲国产欧美| 欧美v国产在线一区二区三区| 久久久久青草大香线综合精品| 国产精品久久久久久久久久久久久久 | 亚洲精品在线视频观看| 136国产福利精品导航网址| 午夜精品福利一区二区三区av| 99pao成人国产永久免费视频| 欧美aⅴ一区二区三区视频| 嫩草国产精品入口| 亚洲第一精品福利| 久久国产黑丝| 美国成人毛片| 最新国产成人av网站网址麻豆| 久久天堂av综合合色| 开心色5月久久精品| 精品成人在线视频| 另类av一区二区| 亚洲国产精品va在看黑人| 亚洲人精品午夜在线观看| 欧美精品免费播放| 日韩视频在线免费| 先锋亚洲精品| 一区二区在线视频播放| 免费成人激情视频| 亚洲黄色成人| 亚洲一区在线视频| 国产视频一区二区三区在线观看| 欧美一区二区三区在线观看视频| 久久夜色精品亚洲噜噜国产mv| 亚洲国产精品久久久久秋霞蜜臀| 欧美va亚洲va国产综合| 一本久道久久综合中文字幕| 欧美一级一区| 亚洲国产另类精品专区| 欧美日韩在线播| 欧美在线在线| 亚洲精品综合精品自拍| 香蕉久久精品日日躁夜夜躁| 国内精品国产成人| 欧美日韩激情小视频| 欧美在现视频| 99re6热只有精品免费观看| 久久精品欧洲| 一本久久知道综合久久| 国产专区欧美精品| 欧美日韩一区高清| 久久一区欧美| 亚洲与欧洲av电影| 亚洲激情社区| 久色婷婷小香蕉久久| 亚洲一区二区av电影| 一区三区视频| 国产精品视频免费观看| 欧美不卡视频| 久久狠狠婷婷| 亚洲综合不卡| 亚洲精品一区二区三区不| 久久―日本道色综合久久| 亚洲图片在线观看| 亚洲人成啪啪网站| 激情视频一区| 国产亚洲网站| 国产九九视频一区二区三区| 欧美激情麻豆| 麻豆精品视频| 久久久福利视频| 欧美一区二区三区婷婷月色 | 久久久久高清| 日韩香蕉视频| 亚洲高清资源|