Boost regex應用舉例(一)

2021-05-22 04:35:38 字數 3879 閱讀 9216

boost::regex應用舉例(一)

newsuppy april, 2010

一, 安裝boost

程式庫

boost

為c++

提供了大量十分有用但是還未被加入到標準庫中的程式庫,我們可以從

www.boost.org

獲取程式庫的源**。

boost

中的某些庫只需要

include

標頭檔案就可以使用,另外一些則需要先行編譯,如

regex

正規表示式就是一例。如何安裝編譯

boost?

這裡僅介紹一下在

windows

平台,如果已經安裝了

visual c++ 9

編譯器,只需要將

boost

包解壓縮後,執行根目錄中的

bootstrap.bat

先行生成

bjam.exe

程式(boost

的make

系統),然後執行

bjam.exe

後,就開始編譯

boost

,完成後會生成

boost.v2

和stage

目錄,內有編譯後的

lib檔案。接下來,我們就可以開始用

boost::regex

庫了,另外

regex

也存在於

c++ tr1

(technical report,

即下乙個

c++0x

標準,也許該是

c++1x

了)中,下文介紹仍舊以

boost::regex

為準。編譯時時需要鏈結相應的

lib檔案。

二, 文字匹配示例

需要處理的檔案格式是這樣的:檔案中存在大量

name

=」value

」格式,這種格式在一行中可能存在乙個,也可能是多個,其中帶有下劃線的斜體字為變數,需要提取出這種格式,存入到乙個資料庫的某個

name-value

的表中。如表

2-1所示為示例檔案的格式

name=」regex」   type=」c++ class」   description=」boost c++ class」

attribute_member_1 = 「regex string」

function_member_1 = 」search」 表

2-1

首先是構建乙個可以匹配

name

=」value

」格式的正規表示式,注意

name

只包含單詞,字母,數字以及下劃線的組合,正好與正規表示式的

』/w』

匹配,另外

』=』的前後可以有空白字元(空格或

tab);

」value

」是以雙引號括起來的文字,

value

本省不可以有雙引號字元,那麼用

"[^"]*"

來匹配,即由雙引號括起來,但是不包含雙引號本身的所有字元,如果只已

"*"來表示,那麼就正能匹配單個

name

=」value

」,遇到多個就會有問題。 在

boost::regex

中就構建這樣乙個正規表示式:

boost::regex reg("(//w+)[//s]*=[//s]*/"([^/"]*)/""); 注意

c++中的

』/』為轉義符,所有需要

』//』

來表示』/』

。表示式中的

』( )』

是為了提取

name 和

」value

」的,否則只能得到整個的匹配的文字。

整個的**片段就如表

2-2:

string full_file_name = path_name_ + dbsrc_file_name_;

ifstream src_file(full_file_name.c_str());

string current_line;

int line_num = 0;

ofstream match_info_file("match_info.src" );

if (src_file) }

it = src_macth_results.suffix().first;

} else

} if (match_flag == false && current_line.length() >=1)

match_info_file << "not match line: "

<< line_num << "/t"

<< current_line.c_str() << "/n" ;

else

if (match_flag == false && current_line.length() <1)

match_info_file << "not match line: "

<< line_num << "/t"

<< "blank line"

<< "/n" ;;

} match_info_file.flush();

match_info_file.close();

} src_file.close(); 表

2-1

因為單行文字中的

name

=」value

」格式可能有多個,所以在匹配時需要用

boost::regex_search

,而boost::regex_match

是用於完全匹配的,如果用在這裡就無法匹配單行中的多個

name

=」value

」格式了。匹配的結果可以在

match_results

中提取出來,其中

match_results的第0

個是整個匹配的字串,而其餘的則是用

』( )』

括起來的被提取部分,對於上面的示例來說就是

name

對應於match_results第1

個結果,

」value

」 對應於

match_results第2

個結果。

三, 推薦書籍

以上內容就是一些簡要的介紹,所以再推薦一些書目。 1,

boost

本身的regex

文件就是很好的參考; 2,

beyond the c++ standard library: an introduction to boostby björn karlsso, 2005

年的老書了,對於

boost

的簡單介紹,當然包括

regex。

3,mastering regular expressions, 3rd editionby jeffrey e. f. friedl

,國內也有本書的中譯本,餘晟

譯。幾乎是正規表示式的最佳書籍了,介紹了各種正規表示式的方言,當然

boost::regex

也支援多種方言的正規表示式。 4,

the c++ standard library extensions: a tutorial and reference, by pete becker,主要是圍繞

c++ tr1

的內容,也包含

regex

,國內有中譯本,史曉明

譯。

Parcelable 應用舉例

首先,自定義物件必須實現parcelable,並且建立static final parcelable.creatorcreator物件 實現createfromparcel和newarray方法 自定義物件為 public static class contact implements parcel...

sed應用舉例

1,sed 3d test.txt 把test.txt中的第三行刪除 2,sed 3a hello world test.txt 在test.txt的第三行後面新增 hello world 這一行 3,sed 3i hello world test.txt 在test.txt的第三行前面面新增 he...

STL list應用舉例

includeusing namespace std include includeint main listilist2 iv,iv 5 ite find ilist.begin ilist.end 99 查詢99的位置 ilist.splice ite,ilist2 在99位置插入ilist2 ...