boost regex簡單用法

2021-05-24 14:53:53 字數 3828 閱讀 3592

1 常用類

1.2 basic_regex 類

定義:template >

class basic_regex;

basic_regex生成和處理乙個正規表示式,這個類的用法很簡單,俱體用法參考文獻[2]。

1.2 sub_match類

這個類處理乙個子表示式的匹配結果,定義如下:

template

class sub_match : public std::pair

;這個類表示和處理乙個子串匹配結果。

match成員變數指示匹配是否成功。

注意到了這個類是從std::pair派生的,所以它有first和second這兩個資料成員,如果匹配成功,first儲存匹配字元子串的開始位置,second儲存匹配字串的結束位置。

sub_match的其它資訊請參考文獻[2]。

1.3 match_results

這個類處理sub_match的std::vector集合,儲存多個匹配子串的結果。

template

class match_results

;從上面的定義可以看出,這個類主要處理std::vector> m_subs。這個類在下面要介紹的幾個介面函式中要用到。

掌握了match_results大體結構就很容易理解它的作用。其它操作資訊可以參考文獻[2]。

2 常用演算法

2.1 演算法1——regex_match

regex_match(..)是乙個全域性模板函式,是boost::regex最基本用法。它作用是根據正規表示式確定整個字串行是否符合一定的格式要求,模式由正規表示式確定。它最常用的地方是輸入合法性的檢驗。

原型1:

template

bool regex_match(

bidirectionaliterator first,

bidirectionaliterator last,

match_results& m,

const basic_regex & e,

match_flag_type flags = match_default);

first, last確定要匹配的目標序列,m是存放匹配的結果(見3.2.3),e就是輸入的正規表示式,flags是匹配標識。返回值如果是true,則說明匹配成功;flase,說明不匹配。

上面這個演算法函式包含乙個匹配結果引數;一般情況下,用這個演算法的時候,我們只要得到是否匹配結果就行了。boost::regex同樣提供乙個過載的函式:

原型2:

template

bool regex_match(

bidirectionaliterator first,

bidirectionaliterator last,

const basic_regex & e,

match_flag_type flags = match_default);

與上乙個過載函式相比,就少了乙個match_results& m, 用起來更方便。regex_match還有幾個重函式,只是引數有變化,總得用法和上面介紹的兩個函式是一樣的。

最後要指出的是regex_match是匹配整個字串行是否符輸入的正規表示式的要求;如果我們找出字串行哪些子串行符合輸入的正規表示式的要求,那就要用regex_search演算法。regex_seach(..)就是下節要介紹的乙個模板演算法。

2.2 演算法2——regex_search

regex_search是用boost::regex最常用到的模板演算法。它的作用是字串行中哪些子串行是匹配輸入的正規表示式的。它的函式原型與regex_match差不多,只是在用法複雜了一些。

原型1:

template

bool regex_search(

bidirectionaliterator first,

bidirectionaliterator last,

match_results& m,

const basic_regex& e,

match_flag_type flags = match_default);

引數first和last確定要匹配的目標序列,m存放匹配結果,e就是輸入的正規表示式, flags是匹配標識。

如果本次匹配成功,返回true;否返回的是false。

regex_search還有幾個過載函式,用法與上面的相同,或者更簡單,所以在這裡不作介紹。它們的原型請參考文獻[2]。

上面介紹的兩種模板演算法基本上可以滿足正規表示式應用的要求。boost::regex還包含其它一些演算法,在某些應用中可以發揮作用,俱體用法請參考文獻[2]。

3 用法舉例

上面介紹正規表示式語法、basic_regex以及regex_match、regex_search兩個模板演算法。現在就根據這些知識實現兩個有意義的演算法。

3.1 regex_match

給出乙個卡號驗證程式,這個程式在文獻[4]中可以找到。

#include

#include

#include

// 驗證卡號是否與正規表示式匹配

bool validate_card_format(const std::string& s)

[- ])//d");

return boost::regex_match(s, e);

}int main()

;int i;

for (i = 0; i < 4; ++i)

return 0;

}3.2 regex_search

下面程式參考了文獻[4],作用是輸入有2個子表示式的正規表示式,獲得匹配結果以及匹配結果在整個序列中的開始索引。

const char* re = "(人)|(a)";  

boost::regex expression(re, boost::regex_constants::normal);

typedef std::pairpair_type; 

typedef std::vectorvec_type;       

void search(const std::string& file, vec_type& vv)

if (what[1].matched)      //

if (what[2].matched)

start = temp;

flags = boost::match_default | boost::match_any;

}vv.push_back(v1);

vv.push_back(v2);

vv.push_back(v3);

}上面的**是與易懂為原則,所以**寫得比較鬆散。

4 對各種編碼的支援

在實際應用開發中,有幾種常用的編碼方案,包括針對中文編碼的gb2312、gb18030,utf7、utf8等,還有統一編碼方案unicode。

regex.hpp中有下面兩行**:

typedef basic_regexregex;

typedef basic_regexwregex;

中文編碼的正規表示式用regex實現就行了;而對於unicode編碼用wregex實現。在這裡要說明一下,wchar_t*並不是unicode字串。俱體什麼是unicode可以參考文獻[5]。

5 參考文獻

[1] www.boost.org boost庫的官方**,這套庫包含許多有用的元件;

[2] boost_1_32_0 boost::regex附帶文件;

[3] boost_1_32_0 boost::regex實現原始碼;

[4] boost_1_32_0 boost::regex附帶examples;

[5] www.unicode.org 在這裡可以找什麼是unicode的主題。

mysql的簡單用法 mysql簡單用法

刪除使用者 drop user jack drop比delete刪除的優勢在於drop可以刪除使用者的許可權,更加徹底 更改使用者名稱 rename user jack to jacknew 使用者的都存在與user表中,更改名稱,許可權不變 更改使用者密碼 update mysql.user se...

oracle cursor 簡單用法

procedure changespecialdiscount compid in invarchar2 ccid in invarchar2 cono in invarchar2 is sum cc all number 14 4 0 wsp disc number 14 4 wspcl disc...

Oracle Trigger簡單用法

1.trigger 是自動提交的,不用commit,rollback 2.trigger最大為32k,如果有複雜的應用可以通過在trigger裡呼叫procedure或function來實現。3.語法 create or replace trigger on declare begin except...