#在vc6中使用PCRE-8.33linux
最近開發項目要遇到數據檢驗問題,打算使用正則表達式,由於它簡單、高效,重要的是,不用把檢驗規則硬編碼在程序裏,放在配置文件中便可。因爲使用的開發工具是vc6,不像vs2008那樣已經自帶boost的regex庫。上網一查,最後在boost regex 和 PCRE 兩個裏選擇。在編譯速度上,boost regex 要慢一些;在運行速度上,PCRE在匹配簡單字符串時更快,boost則在匹配較長字符串時略快。在綜合考慮了大小和易用性以後,選擇了PCRE。正則表達式
正則表達式(regular expression),一般簡寫爲regex、regexp或RE,使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。express
PCRE(Perl Compatible Regular Expressions),是一個函數庫,由Philip Hazel開發,該函數庫使用與Perl5同樣的語法和語義實現了正則表達式的模式匹配功能。PCRE是免費開源的,它是由C語言實現。不少著名的開源軟件如Apache、PHP、KDE、Nginx 等都使用了PCRE。官方主頁--http://www.pcre.org,目前(2013.12)最新版本是8.33。windows
####3.1 下載最新版PCRE數組
下載地址----ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ windows用戶下載擴展名爲 zip 的文件就好。下載完成後,解壓縮。函數
順便提一下,也能夠在這個網址(http://www.psyon.org/projects/pcre-win32/) 下載帶vs工程文件的源碼,但這個網站的版本要滯後於 PCRE 官網的。好比如今,官網的最新版本是8.33,而這個網站的最新版本是7.9。工具
####3.2 編譯 PCRE學習
PCRE的做者Philip Hazel是在linux上工做的,因此編譯PCRE最好的辦法天然是configure, make, make install三步曲了。在windows下, cygwin或者MinGW都支持這麼作,雖然它們兩者實際上是徹底不一樣的。網上有許多文章也講了手工編譯PCRE的方法,雖然不是針對最新版本的,但略做修改,也是可行的(但要作到一鍵搞定,還要多下功夫才行)。開發工具
今天我要介紹的是用CMake。CMake是一種配置工具,能夠用來代替「configure」。有愈來愈多的開源程序支持 CMake,由於其簡單、實用、足夠強大。網站
先從 http://www.cmake.org 上下載最新版的CMake,我是直接下載的安裝包:cmake-2.8.12.1-win32-x86.exe。而後安裝,最好安裝到沒有空格的目錄下(事實上,這是個好習慣)。安裝完成後別忘了把 cmake/bin 放到環境變量path中。
在解壓縮後的PCRE目錄下建個子目錄build,好比個人D:\pcre-8.33\build。
進入控制檯,而後先運行vc6的設置環境變量的批處理,個人機器上是D:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT,而後鍵入 cmake-gui ,回車。
設置要編譯的源代碼的路徑以及編譯好的二進制文件存放的路徑
點"Configure"按鈕,而後選擇編譯器,能夠選擇合適的編譯器,由於我用的就是vc6,因此我選擇了 "Visual Studio 6"。
CMake 會讀取源代碼目錄下的文件 CMakeLists.txt ,而後將讀到的配置以紅顏色顯示出來,此時能夠根據咱們的須要適當的選擇或去掉一些配置,好比加上 PCRE_SUPPORT_UTF,去掉PCRE_SUPPORT_JIT(不須要嵌入式的代碼)、PCRE_BUILD_PCRECPP(我只想要c形式的庫);還能夠修改一些配置的值,好比把PCRE_NEWLINE從LF改爲CRLF。而後再點一下"Configure",最後點"Generate",你會發如今build目錄裏生成了一系列的vc6的工程文件以及一些.h文件和.c文件。咱們最關心的是pcre.dsp。打開它,剩下的,對咱們應該都不是問題了。:)
####3.3 在工程中使用PCRE
包含頭文件 #include "pcre.h"
連接靜態庫 #pragma comment(lib,"pcre.lib")
在項目」預處理器定義「中加上PCRE_STATIC
示例代碼:
pcre *myregexp; const char *error; int erroroffset; int offsetcount; int offsets[(0+1)*3]; // (max_capturing_groups+1)*3 myregexp = pcre_compile("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}\\b", 0, &error, &erroroffset, NULL); if (myregexp != NULL) { offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, 0, offsets, (0+1)*3); while (offsetcount > 0) { // match offset = offsets[0]; // match length = offsets[1] - offsets[0]; if (pcre_get_substring(subject, &offsets, offsetcount, 0, &result) >= 0) { // Do something with match we just stored into result } offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, offsets[1], offsets, (0+1)*3); } } else { // Syntax error in the regular expression at erroroffset }
接口介紹: pcre *pcre_compile、pcre_exec
pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr); 功能:編譯一個描述正則表達式的字符串 參數:pattern, 輸入參數,將要被編譯的字符串形式的正則表達式 options, 輸入參數,用來指定編譯時的一些選項 errptr, 輸出參數,用來輸出錯誤信息 erroffset, 輸出參數,pattern中出錯位置的偏移量 tableptr, 輸入參數,用來指定字符表,通常狀況用NULL, 使用缺省的字符表 返回值:被編譯好的正則表達式的pcre內部表示結構 int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize); 功能:用來檢查某個字符串是否與指定的正則表達式匹配 參數: code, 輸入參數,用pcre_compile編譯好的正則表達結構的指針 extra, 輸入參數,用來向pcre_exec傳一些額外的數據信息的結構的指針 subject, 輸入參數,要被用來匹配的字符串 length, 輸入參數, 要被用來匹配的字符串的指針 startoffset, 輸入參數,用來指定subject從什麼位置開始被匹配的偏移量 options, 輸入參數, 用來指定匹配過程當中的一些選項 ovector, 輸出參數,用來返回匹配位置偏移量的數組 ovecsize, 輸入參數, 用來返回匹配位置偏移量的數組的最大大小 返回值:匹配成功返回非負數,匹配返回負數
簡單的說,pcre_compile 把一個描述正則表達式的字符串編譯成內部表示形式,以後就能夠用pcre_exec來進行匹配、捕獲等工做。
固然,PCRE的功能是很是強大的,遠不止上面說的那麼簡單。剩下的就看咱們本身的探索了。
順便說一句:PCRE源代碼目錄下testdata目錄中的那些輸入和輸出文件,自己就是很好的學習正則表達式極好的東西。