1. 什么是Boost.Regex?
Boost是C++中僅次於STL的一套庫,它的功能比STL更加全面。這里是Boost的主頁,想了解Boost的朋友可以看一下:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html。需要說明的一點是,Boost目前還不是C++標准庫的一部分,因此如果要使用Boost中的庫,需要自己安裝一下。
Boost.Regex是Boost中的正則表達式庫,它是由John Maddock提供的,它的全部文檔在這里:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html
2. Boost.Regex的編譯
最新的Boost庫是1.42.0,在使用Boost.Regex之前,需要先下載Boost庫,可以通過下面兩種方式下載:
(1)Http下載,下載地址是http://sourceforge.net/projects/boost/files/boost/1.42.0/
(2)用svn客戶端來下載,地址是:http://svn.boost.org/svn/boost/trunk/
我個人比較推薦使用svn客戶端來下載,這樣的話,如果要更新直接svn update一下,就不用再去重新下載了。
下載好了Boost庫,下面開始編譯, 本文中我以Linux平台為例進行說明,其它平台的編譯方法參見上面提到的文檔。下面是具體的步驟:(假設下載完后的,代碼解壓在了BOOST_ROOT目錄)
(1)進入到BOOST_ROOT/libs/regex/build目錄
(2)如果要使用靜態庫,請執行make -fgcc.mak
(3)如果要使用靜態庫,請執行make -fgcc-shared.mak
執行完上面三步后的,在BOOST_ROOT/libs/regex/build/下會生成一個gcc目錄 ,進入該目錄 ,可以看到生成了下面四個文件:
(1)libboost_regex-gcc-1_42.a , 這是release版的靜態庫
(2)libboost_regex-gcc-1_42.so, 這是release版的動態庫(共享庫)
(3)libboost_regex-gcc-d-1_42.a, 這是debug版的靜態庫
(4)libboost_regex-gcc-d-1_42.so, 這里debug版的動態庫(共享庫)
編譯好之后的,就可以開始使用了。這里提供一個我編譯好的版本,如果讀者朋友不想自己編譯,可以直接從我這里下載使用,下載完記得校驗一下MD5: b6e0d805ea22ba08cb230ca98a517953。
點此下載:libboost_regex.tar.gz。
3. Boost Regex Libray類和接口介紹
(1)basic_regex
basic_regex是一個模板類,它封裝了正則表達式的解析和編譯,它是Boost.Regex中用來表示正則表達式的對象類型。Boost.Regex定義了兩種標准類型,一種是基於單字節字符的regex,另一種是基於寬字符的wregex
關於basic_regex提供的接口,和STL中basic_string所提供的十分類似,具體可以參考:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html
(2)match_results
match_results是用來表示所有匹配指定正則表達式的字符串的集合的對象類型。Boost.Regex提供了四種標准類型的定義:C單字節字符類型的cmatch, C寬字符類型的wcmatch, C++單字節字符類型smatch, C++寬字符類型wsmatch。match_results所提供的接口參見:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/match_results.html
(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所提供的接口請參考:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/sub_match.html
(4)reg_match, reg_search和reg_replace
reg_match, reg_search和reg_replace都是Boost.Regex所提供的具體進行正則匹配的算法接口。
reg_match用來判定整個字符串是否匹配指定的的正則表達式, 具體定義參見:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html
reg_search用來判定字符串的某一部分是否匹配指定的正則表達式, 具體定義參見:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html
reg_replace用來把字符串中匹配指定正則表達式的部分替換為指定內容輸出,對於不匹配的部分原樣輸出, 具體定義參見:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html
4.Boost Regex Libray使用注意事項
(1)在使用之前你需要把Boost的安裝目錄加入到系統的Path中(當然也可以在編譯時直接指定)
(2)需要包含的頭文件 boost/regex.hpp
(3)需要依賴的庫:上步中編譯好的四個庫,取其中任意一個即可,具體如何使用動態/靜態庫,請自己查閱相關資料
(4)程序編譯成功后,在執行之前,還要在shell中運行:export LD_LIBRARY_PATH="path", path為你的libboost_regex-gcc-1_44.so所在的目錄,然后再運行你的程序。
我的是:export LD_LIBRARY_PATH="/home/zhdr/test/boost/libs/regex/build/gcc"
5. Boost.Regex使用舉例
下面是Boost.Regex使用的一個簡單的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <string> #include <iostream> #include "boost/regex.hpp" int main(int argc, char ** argv) { if (argc != 4) { std::cerr < < "Usage: " << argv[0] << " option regex text\n" << "option: 0 --whole match\n" << " 1 --sub match\n" << " 2 --replace match\n"; return 1; } boost::regex oRegex(argv[2]); boost::smatch oResults; std::string strStr(argv[3]); std::string strRes; switch (atoi(argv[1])) { case 0: if(boost::regex_match(strStr, oResults, oRegex)) { std::cout << strStr << " matches " << oRegex << "\n"; } else { std::cout << strStr << " doesn't match " << oRegex << "\n"; } break; case 1: if(boost::regex_search(strStr, oResults, oRegex)) { std::cout << strStr << " matches " << oRegex << "\n"; } else { std::cout << strStr << " doesn't match " << oRegex << "\n"; } break; case 2: strRes = boost::regex_replace(strStr, oRegex, "$$$$"); std::cout << "strRes=" << strRes << "\n"; break; default: std::cerr << "Invalid option: " << argv[1] << "\n"; break; } } |
下面是程序運行的結果:
1 2 3 4 5 6 7 8 |
wuzesheng@wuzesheng-ubuntu:~/Program$ !g++ g++ -I./boost_1_42_0 BoostRegex.cpp -L ./boost_1_42_0/libs/regex/build/gcc/ -lboost_regex-gcc-1_42 -o BoostRegex wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 0 "http:\/\/www\..*\.com" "http://www.soso.comjfj" http://www.soso.comjfj doesn't match http:\/\/www\..*\.com wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 1 "http:\/\/www\..*\.com" "http://www.soso.comjfj" http://www.soso.comjfj matches http:\/\/www\..*\.com wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 2 "http:\/\/www\..*\.com" "http://www.soso.comjfj" strRes=$$jfj |
以上即是Boost.Regex的主要的內容以及具體使用的一些情況。這里我需要說明一下,由於Boost.Regex所提供的像basic_regex, match_results, sub_match這些類型,它們的封裝與C++中string等其它stl容器的封裝很相似,因此使用過程中可以做聯想類比,以加深理解。另外,像regex_match, regex_search, regex_replace這些算法都是模板函數,而且都有多個重載版本,在使用的時候,注意選擇適合自己的應用場景的版本。
附注:
在linux下的編程,毫無疑問的遲早都要用到LD_LIBRARY_PATH這個環境變量,不過這個環境變量是基於shell的,也就是說只有在當前設置了的shell里才會有作用,因此每次打開新的shell運行程序不停地設置LD_LIBRARY_PATH,是一件非常麻煩的事情,所以我們就會想有不有什么一勞永逸地方法,使得設置之后就不用再去設置了?答案是肯定的,即在~/目錄下打開.bash_profile文件,設置環境變量如下:
1. LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH 2. export LD_LIBRARY_PATH |