天天看點

Boost學習之正規表達式--regex

boost::regex類為c++提供了完整的正規表達式支援,并且已被接收為c++0x标準庫。它同時也在boost庫中扮演着極重要的角色,不少boost子庫都需要它的支援,有不少人甚至就是為了它才下載下傳使用boost的。

boost::regex的預設正規表達式文法是perl文法

        boost::regex支援perl regular表達式、posix-extended regular表達式和posix-basic regular表達式,但預設的表達式文法是perl文法,如果要使用其餘兩種文法需要在構造表達式的時候明确指定。

boost::regex對unicode編碼的支援

        boost::regex使用icu來實作對unicode及unicode變種的支援,這需要在編譯boost的時候指出是否使用icu以及icu所在 的目錄。否則編譯出來的boost::regex不支援unicode編碼。其中boost::wregex支援unicode編碼的搜尋,如果要搜尋 utf-8、utf-16、uft-32編碼的字元串,則要用boost::u32regex。注意boost::wregex隻能支援unicode編 碼,不能支援uft編碼。

搜尋時如何忽略大小寫

        如果要在搜尋時忽略大小寫(即大小寫不敏感),則要用到表達式選項boost::regex::icase,例如: boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

boost regex libray類和接口介紹

(1)basic_regex

basic_regex是一個模闆類,它封裝了正規表達式的解析和編譯,它是boost.regex中用來表示正規表達式的對象類型。boost.regex定義了兩種标準類型,一種是基于單位元組字元的regex,另一種是基于寬字元的wregex

關于basic_regex提供的接口,和stl中basic_string所提供的十分類似,具體可以參考:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html</a>

(2)match_results

match_results是用來表示所有比對指定正規表達式的字元串的集合的對象類型。boost.regex提供了四種标準類型的定義:c單位元組字元類型的cmatch, c寬字元類型的wcmatch, c++單位元組字元類型smatch, c++寬字元類型wsmatch。match_results所提供的接口參見:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/match_results.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/match_results.html</a>

(3)sub_match

sub_match是用來表示比對指定正規表達式的字元串的對象類型。match_results就是由sub_match組成的集合類型。

關于sub_match類型,有下面三點需要注意的:

a. sub_match類型的對象隻能通過對match_results類型的對象取下标擷取

b. sub_match類型的對象可以和std:basic_string或const char*的字元串進行比較

c. sub_match類型的對象可以和std::basic_string或const char*的字元串相加,生成新的std::basic_string類型的字元串

sub_match所提供的接口請參考:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/sub_match.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/sub_match.html</a>

(4)reg_match, reg_search和reg_replace

reg_match用來判定整個字元串是否比對指定的的正規表達式, 具體定義參見:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html</a>

reg_search用來判定字元串的某一部分是否比對指定的正規表達式, 具體定義參見:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html</a>

reg_replace用來把字元串中比對指定正規表達式的部分替換為指定内容輸出,對于不比對的部分原樣輸出, 具體定義參見:

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html</a>

要使用boost.regex, 你需要包含頭檔案"boost/regex.hpp". regex是本書中兩個需要獨立編譯的庫之一(另一個是boost.signals)。你會很高興獲知如果你已經建構了boost— —那隻需在指令提示符下打一行指令——就可以自動連結了(對于windows下的編譯器),是以你不需要為指出那些庫檔案要用而費心。

你要做的第一件事就是聲明一個類型 basic_regex 的變量。這是該庫的核心類之一,也是存放正規表達式的地方。建立這樣一個變量很簡單;隻要将一個含有你要用的正規表達式的字元串傳遞給構造函數就行了。

如果隻要編譯regex庫,有兩種方法(參考連結):

在boost根目錄下運作bjam --toolset=&lt;編譯器名&gt; --with-regex 其它參數

到\libs egex\build裡,找到對應編譯器的makefile,然後make -f xxxx.mak

模闆類:

l         basic_regex          用來儲存一個“正規表達式”的類。

l         sub_match            繼承于pair&lt;iterator,iterator&gt;疊代器組,用來表示比對的一個結果。

l         match_results             sub_match的容器,用來表示一次搜尋或比對算法的所有結果,類似于vector&lt;sub_match&gt;。

算法:

l         regex_math   比對算法,測試一個字元串是否和一個正則式比對,并通過match_results傳回結果。

l         regex_find     查找算法,查找字元串的一個和正則式比對的字串,并通過match_results傳回結果。

l         regex_format       替換算法,查找字元串中的所有比對正則式的字串,并使用“格式化字元”串替換。

疊代器:

l         regex_iterator      枚舉一個字元串中所有比對的字串,regex_iterator的結果相當于match_results。

l         regex_token_iterator 枚舉一個字元串中所有比對的字串,regex_iterator的結果相當于sub_match。

boost.regex手裡有七種武器和兩****寶

其中的七種武器是:

每種武器都又有諸多變化(每個函數都分别以c字元串類型、std::string類型、疊代器類型作為參數重載),不過後面四種武器因年久失修已不建議使用.

兩****寶是:

這兩****寶是整個boost.regex的靈魂,用熟它們以後那是“摘花飛葉即可傷人”啊~~

所需頭檔案 #include &lt;boost/regex.hpp&gt;

要确定一行字元串是否與指定的正規表達式比對,使用regex_match。

下面這個代碼可以驗證szstr字串(定義在上面)是否與szreg比對。

boost::regex的構造函數中還可以加入标記參數用于指定它的行為,如:

下面這個代碼不僅驗證是否比對,而且可以從中提取出正規表達式括号對應的子串。

其中,boost::cmatch是一個針對c字元串的特化版本,它還有另三位兄弟,如下:

可以把match_results看成是一個sub_match的容器,同時它還提供了format方法來代替regex_format函數。

一個sub_match就是一個子串,它從std::pair繼承而來,這個疊代器pair裡的first和second分别指向了這個子串開始和結尾所在位置。同時,sub_match又提供了str(),length()方法來傳回整個子串。

regex_match隻驗證是否完全比對,如果想從一大串字元串裡找出比對的一小段字元串(比如從網頁檔案裡找超連結),這時就要使用regex_search了。

下面這段代碼從szstr中找數字

regex_replace提供了簡便的方法來部分替換源字元串

正規表達式中,使用$1~$9(或\1~\9)表示第幾個子串,$&amp;表示整個串,$`表示第一個串,$'表示最後未處理的串。

正規表達式中,使用(?1~?9新字串)表示把第幾個子串替換成新字串

對應于c字元串和c++字元串以及寬字元,regex_iterator同樣也有四個特化:

這個疊代器的value_type定義是一個match_results。

boost.regex也提供了make_regex_iterator函數簡化regex_iterator的構造,如上面的itrbegin可以寫成:

它同樣也有四個特化,形式和上面類似,就不再寫一遍騙篇幅了。

    這個疊代器的value_type定義是一個sub_match。

boost.regex也提供了make_regex_token_iterator函數簡化regex_token_iterator的構造,最後的那個參數-1表示以reg為分隔标志拆分字元串,如果不是-1則表示取第幾個子串,并且可以使用數組來表示同時要取幾個子串,例如:

<a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/hs600312.aspx">正規表達式教程</a>

<a target="_blank" href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html">聯機文檔</a>

1、完全比對

2、完全比對并擷取子串

    3、查找, 當你不需要比對整個字元串的時候,可以選擇查找

    4、替換。 替換比對到的子字元串, 可以通過$n 引用第n個比對到的值、$&amp;  引用全比對

5、疊代。 當需要從字元串中提取多個表達式時,可以采用疊代進行提取

    6、分詞