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

Boost.Regex庫學習筆記

Posted on 2009-07-24 11:48 天邊藍 閱讀(7324) 評論(0)  編輯 收藏 引用 所屬分類: boost學習
 

C++編程中,有一點讓人挺遺憾的就是C++尚不支持正則表達式,這讓很多用戶為了編寫支持正則表達式程序而不得不放棄C++。然而,Boost.Regex庫填補了C++在這方面的空白,它使C++很好的支持各種引擎的正則表達式。

       結合我的學習,逐步分析Boost.Regex庫。

       ……

       Boost.Regex默認使用Perl正則表達式,關于Perl正則表達式的使用,這里就不多說明了,可以參考相關資料。

       Boost的正則表達式封裝在boost::basic_regex對象中,與std::basic_string一樣,boost::basic_regex表示的是一族類,也與std::basic_string一樣typedef了幾個特例:

              typedef basic_regex<char> regex;

              typedef basic_regex<wchar>wregex;

       Boost.Regex的幾個中重要的成員函數人如下:

1.       explicit basic_regexconst CharT* p,flag_type regex_constants::normal;

該構造函數接受一個包含正則表達式的字符序列,以及一個表示正則表達式所選的參數信息——例如是否大小寫或使用什么引擎的正則表達式。這里注意,如果傳遞的字符序列是無效的正則表達式,則會拋出異常regex_error

2.       bool emply()const

該成員函數檢測basic_regex示例是否包含有效的正則表達式。

3.       unsigned mark_count() const;

該成員函數返回該basic_regex示例中的正則表達式包含的有標記的子表達式的個數。

4.       flag_type flags()const;

該函數返回一個位掩碼,其中包含basic_regex所設置的選項標志。具體標志選項有:icase—忽略字符大小寫和JavaScriptregex使用JavaScript語法

 

另外,Boost.Regex定義了幾個自由函數,實現正則表達式的匹配查詢及修改:

1.       判斷正則表達式時候匹配整個字符串

 

 1template <typename CharT,typename Allocator,typename traits>
 2
 3bool regex_match(
 4
 5const CharT*
 6
 7match_result<const chart*,Allocator>&m,
 8
 9const basic_regex<CharT,traits>& reg,
10
11match_flag_type flags=match_default);
12

 

2.       查找字符串中與正則表達式匹配的子序列

 

template <typename CharT,typename Allocator,typename traits>

bool regex_rearch(

const CharT*

match_result
<const chart*,Allocator>&m,

const basic_regex<CharT,traits>& reg,

match_flag_type flags
=match_default);

 

3.       查找字符串中所有正則表達式的匹配,并根據參數fmt格式化所匹配的串

 

template <typename CharT,typename Allocator,typename traits>

basic_string
<CharT > regex_replace(

const basic_string<CharT >& s,   

const basic_regex<CharT,traits>& reg,

const basic_string<CharT >& fmt,       

match_flag_type flags
=match_default);

 

使用說明

1.       創建regex對象:

 

Include<boost/regex.hpp>

regex reg(“(.
*)”);

 

2.       regex_match

該函數用來對一個字符串的完全匹配,在很多校驗信息中可以廣泛使用,具體使用示例見附后的測試代碼

3.       regex_rearch

說到這個函數,必須要說明下boost.match_result regex_rearch在執行查找時,通過一個match_result類型的對象來報告匹配的自表達式。

match_result主要封裝了一個std::vector<sub_match<<>> >類型的對象,sub_match類繼承自std::pair,主要記錄匹配的結果信息。關于match_resultsub_match的詳細了解可以閱讀boost設計源碼:

 

                     使用示例查看附后的測試源碼。

4.       regex_replace

該函數根據指定的fmt格式化通過正則表達式匹配的子串。需要注意的是,該函數不會修改原字符串,只是將格式化后的結果返回。具體使用示例見附后測試源碼。

5.       regex_iterator

通過多次調用regex_rearch我們可以處理所有滿足匹配的字串。但是,Regex庫還給我們提供了一個更優雅的方法——即通過regex_iterator。通過字符串和正則表達式構造regex_iterator的時候會構建一個match_result的對象用于保存匹配結果信息,再通過重載++運算符達到遍歷所有匹配信息的目的。關于regex_iterator的詳細了解可以參考Regex的設計源碼:

             

使用示例查看附后的測試源碼。

6.       regex_token_iterator

regex_iterator相似,Regex還提供了一個列舉與正則表達式不匹配的子表達式,就是regex_token_iterator。與stl的設計類似,是通過迭代器適配器實現的。這個特性讓我們很容易的分割字符串。關于regex_token_iterator的詳細了解請查看Regex的設計源碼:

 

              7.測試源碼

                    

 1#include<iostream>
 2#include<string>
 3#include<cassert>
 4#include<boost/regex.hpp>
 5#include<vector>
 6#include<iterator>
 7
 8bool validate_identify_card(const std::string &s){
 9    boost::regex reg("\\d{17}[A-Z0-9]");
10    return boost::regex_match(s,reg);
11}

12class regex_callback{
13    public:
14    template<typename T>
15    void operator()(const T& what){
16        std::cout<<what[1].str()<<std::endl;
17    }

18}
;
19
20int main(){
21    {
22        boost::regex reg("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");
23        std::string correct="123Hello N/A Hello";
24        std::string incorrect="123Hello 12 hello";
25        assert(boost::regex_match(correct,reg)==true);
26        assert(boost::regex_match(incorrect,reg)==false);
27    }

28    {
29        std::string s="421124598608976345";
30        assert(validate_identify_card(s)==true);
31    }

32    {
33        boost::regex reg("(new)|(delete)");
34        boost::smatch m;
35        int new_counter=0,delete_counter=0;
36        std::string s="Calls to new must be followed by delete.Calling simply new results in a Leak!";
37        std::string::const_iterator it=s.begin();
38        std::string::const_iterator end=s.end();
39        while(boost::regex_search(it,end,m,reg)){//這里參數必須是const屬性
40            if(m[1].matched){
41                std::cout<<"The expression(new) matched"<<std::endl;
42                new_counter++;
43            }

44            if(m[2].matched){
45                std::cout<<"The expression(delete) matched"<<std::endl;
46                delete_counter++;
47            }

48            it=m[0].second;
49        }

50        std::cout<<"new_counter="<<new_counter<<std::endl;
51        std::cout<<"delete_counter="<<delete_counter<<std::endl;
52    }

53    {//使用boost::regex_replace
54        boost::regex reg("(colo)(u)(r)",boost::regex::icase|boost::regex::perl);
55        std::string s="Colour,colour,color,colOurize";
56        s=boost::regex_replace(s,reg,"$1$3");//regex_replace不直接修改s的值,而是返回新值
57        std::cout<<s<<std::endl;
58    }

59    {//使用boost::regex_iterator迭代器輸出所有匹配項
60        boost::regex reg("(\\d+),?");
61        std::string s="1,2,3,4,5,6,7,85,ad2348(,hj";
62        boost::sregex_iterator it(s.begin(),s.end(),reg);
63        boost::sregex_iterator end;
64        for_each(it,end,regex_callback());
65    }

66    {
67        boost::regex reg("/");
68        std::vector<std::string> vec;
69        std::string s="Split/Vulue/Teather/Neusoft/Write/By/Lanwei";
70        boost::sregex_token_iterator it(s.begin(),s.end(),reg,-1);
71        boost::sregex_token_iterator end;
72        while(it!=end)
73            vec.push_back(*it++);
74        copy(vec.begin(),vec.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
75    }

76    {
77        boost::smatch m;
78        boost::regex reg("(new)|(delete)");
79        std::string s="Calls to new must be followed by delete.Calling simply new results in a Leak!";
80        std::string::const_iterator it=s.begin();
81        std::string::const_iterator end=s.end();
82        while(boost::regex_search(it,end,m,reg)){
83            std::cout<<"size="<<m.size()<<std::endl;
84            std::cout<<"m[-2]="<<m[-2]<<std::endl;
85            std::cout<<"m[-1]="<<m[-1]<<std::endl;
86            std::cout<<"m[0]="<<m[0]<<std::endl;
87            std::cout<<"m[1]="<<m[1]<<std::endl;
88            //std::cout<<"m[2].type="<<typeid(m[2].first).name()<<std::endl;
89            std::cout<<"m[2]="<<m[2]<<std::endl;
90           // std::cout<<"m[2].first="<<m[2].first<<std::endl;
91            //std::cout<<"m[2].second="<<m[2].second<<std::endl;
92            it=m[0].second;
93        }

94    }

95    return 0;
96}

97

 

       學習小結

              關于Boost.Regex庫的初步學習暫時告以段落。這是個非常有用的庫,打破了用戶只有通過POSIX CAPI實現正則表達式的局限。然而,這是一個偉大的庫博大精深的庫,以上的了解只不過的鳳毛麟角,其內部還有很多的隱藏秘密需要花大量的時間去挖掘,探索。

 


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


Copyright © 天邊藍

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            蜜臀av一级做a爰片久久| 亚洲成人在线| 蜜臀av国产精品久久久久| 免费亚洲电影在线| 午夜精品免费视频| 欧美黄色片免费观看| 欧美一区二区视频在线| 欧美劲爆第一页| 久久天天躁狠狠躁夜夜爽蜜月| 欧美国产欧美综合| 免费亚洲网站| 国产精品无码专区在线观看| 亚洲国产日韩欧美在线99| 国产日韩精品久久| 中文在线不卡| 中文欧美日韩| 牛人盗摄一区二区三区视频| 久久综合九色九九| 国产一区二区三区的电影 | 国产精品美女www爽爽爽| 亚洲国产高清aⅴ视频| 激情五月综合色婷婷一区二区| 亚洲无毛电影| 亚洲一区二区三区国产| 欧美日韩国产首页在线观看| 欧美凹凸一区二区三区视频| 国产一区二区三区高清在线观看 | 欧美大秀在线观看| 欧美 日韩 国产在线| 国产一区久久久| 先锋亚洲精品| 久久尤物视频| 1024精品一区二区三区| 久久av资源网站| 老司机成人网| 在线不卡亚洲| 免费不卡在线观看| 亚洲电影第1页| 亚洲精品少妇网址| 欧美日本在线观看| 99国产精品99久久久久久粉嫩| 一区二区三区日韩精品视频| 欧美日韩一区二区免费在线观看| 亚洲美女尤物影院| 亚洲一区二区三区成人在线视频精品 | 国产精品xxxxx| 亚洲欧美高清| 久久人人97超碰精品888| 激情欧美丁香| 欧美精品在线网站| 在线中文字幕一区| 久久国产黑丝| 亚洲第一中文字幕| 欧美精品在线观看| 亚洲性感美女99在线| 久久精品国产综合精品| 亚洲高清激情| 欧美日韩一区二区三区高清| 午夜日韩在线观看| 免费毛片一区二区三区久久久| 91久久精品一区| 国产精品久久久一本精品| 欧美在线影院| 91久久久一线二线三线品牌| 亚洲欧美电影在线观看| 国产一区二区三区视频在线观看| 开心色5月久久精品| 亚洲美女网站| 久久久伊人欧美| av成人国产| 国产亚洲欧美日韩日本| 欧美岛国激情| 香蕉久久久久久久av网站| 亚洲第一精品夜夜躁人人爽| 亚洲综合色网站| 影音先锋久久| 国产精品久久久久国产a级| 老色批av在线精品| 亚洲一区二区三区精品视频| 欧美国产高清| 欧美一区二区视频观看视频| 亚洲品质自拍| 国产日韩精品一区二区三区在线| 欧美成人有码| 久久九九99视频| 亚洲视频自拍偷拍| 亚洲高清在线视频| 久久综合国产精品台湾中文娱乐网| 亚洲少妇中出一区| 最新国产乱人伦偷精品免费网站| 国产麻豆午夜三级精品| 欧美绝品在线观看成人午夜影视| 久久国产一二区| 这里只有精品电影| 亚洲茄子视频| 欧美激情aⅴ一区二区三区| 久久精品视频网| 亚洲综合三区| 亚洲视频在线二区| 亚洲精品一线二线三线无人区| 好男人免费精品视频| 国产精品久久久久久久久久久久久久 | 国产亚洲aⅴaaaaaa毛片| 欧美日韩综合一区| 欧美精品一区视频| 女同一区二区| 欧美88av| 久久男人资源视频| 欧美另类极品videosbest最新版本| 久久免费国产精品| 亚洲女人天堂成人av在线| 99精品黄色片免费大全| 亚洲电影在线免费观看| 好吊日精品视频| 国产亚洲一区在线| 国产一区二区剧情av在线| 国产欧美日韩精品专区| 国产老女人精品毛片久久| 国产精品久久影院| 国产精品日韩精品欧美精品| 国产精品捆绑调教| 国产色产综合产在线视频| 国产欧美一区二区三区国产幕精品| 国产欧美激情| 国产一区二区日韩精品欧美精品| 国产日产欧产精品推荐色| 国产在线观看91精品一区| 国内精品久久久久影院薰衣草| 国产人久久人人人人爽| 激情五月综合色婷婷一区二区| 狠狠色狠狠色综合系列| 1024日韩| 在线视频日韩| 校园春色国产精品| 久久久久久香蕉网| 亚洲国产va精品久久久不卡综合| 91久久久国产精品| 日韩亚洲精品在线| 亚洲免费在线电影| 久久精品国产免费看久久精品| 久久先锋资源| 欧美日韩亚洲视频一区| 国产精品爽爽ⅴa在线观看| 国产精品久久久久久av福利软件| 国产一区二区三区四区五区美女| 亚洲国产精品久久久久| 亚洲视频在线一区观看| 久久国产黑丝| 亚洲国产成人在线播放| 亚洲一区二区三区三| 久久九九精品99国产精品| 欧美日韩国产高清| 国产一区二区高清| 91久久精品国产91性色| 亚洲男女自偷自拍| 欧美波霸影院| 亚洲视频一区二区免费在线观看| 欧美制服丝袜第一页| 欧美激情精品久久久六区热门 | 亚洲一卡二卡三卡四卡五卡| 久久免费99精品久久久久久| 亚洲巨乳在线| 久久先锋影音| 国产精品日韩一区二区三区| 亚洲国产精品国自产拍av秋霞| 亚洲自拍另类| 亚洲国产欧美国产综合一区 | 一区二区三区国产精品| 久久久综合香蕉尹人综合网| 欧美日韩综合久久| 亚洲片区在线| 免费一区视频| 欧美一区午夜视频在线观看| 国产精品成人一区二区| 亚洲日本国产| 麻豆免费精品视频| 亚洲一区二区三区中文字幕在线 | 国产精品三上| 中日韩视频在线观看| 亚洲成人资源网| 久久久av毛片精品| 国产日韩精品在线| 亚洲欧美精品伊人久久| 日韩视频一区二区三区在线播放免费观看| 久久久久国产一区二区| 国产精品中文字幕欧美| 亚洲一区在线免费观看| 99精品视频免费观看视频| 欧美黄色影院| 亚洲精品久久视频| 欧美激情一区二区三区高清视频| 久久成人免费网| 国产一区二区三区无遮挡| 欧美在线高清视频| 亚洲女与黑人做爰| 国产精品羞羞答答| 亚洲欧美欧美一区二区三区| 亚洲私人黄色宅男| 国产精品豆花视频| 亚洲欧美自拍偷拍|