正则之PCRE库
目錄
?
什么是PCRE庫?
1.PCRE庫簡(jiǎn)介
2.PCRE正則基礎(chǔ)知識(shí)
PCRE庫的安裝(linux)
PCRE庫的使用
1.PCRE庫的函數(shù)接口
2.PCRE使用過程
3.PCRE實(shí)例
參考文章
什么是PCRE庫?
1.PCRE庫簡(jiǎn)介
PCRE(Perl Compatible Regular Expressions):perl語言兼容正則表達(dá)式。PCRE是一個(gè)用C語言編寫的正則表達(dá)式函數(shù)庫。PCRE是一個(gè)輕量級(jí)的函數(shù)庫,比Boost之中的正則表達(dá)式庫小得多。PCRE十分易用,同時(shí)功能也很強(qiáng)大,性能超過了POSIX正則表達(dá)式庫和一些經(jīng)典的正則表達(dá)式庫。
????????和Boost正則表達(dá)式庫的比較顯示,雙方的性能相差無幾,PCRE在匹配簡(jiǎn)單字符串時(shí)更快,Boost則在匹配較長(zhǎng)字符串時(shí)勝出---但兩者差距很小,考慮到PCRE的大小和易用性,我們可以認(rèn)為PCRE更值得考慮。
????????PCRE被廣泛使用在許多開源軟件之中,最著名的莫過于Apache HTTP服務(wù)器和PHP腳本語言、R腳本語言,此外,正如從其名字所能看到的,PCRE也是perl語言的缺省正則庫。
????????PCRE是用C語言實(shí)現(xiàn)的,其C++實(shí)現(xiàn)版本叫PCRE++。
2.PCRE正則基礎(chǔ)知識(shí)
PCRE正則表達(dá)式主要用于字符串的模式分割、匹配、查找及替換操作。
正則中重要的幾個(gè)概念有:元字符、轉(zhuǎn)義、模式單元(重復(fù))、反義、引用和斷言。我們簡(jiǎn)單列一下常用字符:
常用的元字符(Meta-character)
????????元字符????說明
????????\A?????匹配字符串串首的原子
????????\Z?????匹配字符串串尾的原子
????????\b?????匹配單詞的邊界/\bis/匹配頭為is的字符串/is\b/?匹配尾為is的字符串?/\bis\b/?定界
????????\B? ? ?匹配除單詞邊界之外的任意字符?? /\Bis/???匹配單詞“This”中的“is”
????????\d? ? ? 匹配一個(gè)數(shù)字;等價(jià)于[0-9]
????????\D?????匹配除數(shù)字以外任何一個(gè)字符;等價(jià)于[^0-9]
????????\w?????匹配一個(gè)英文字母、數(shù)字或下劃線;等價(jià)于[0-9a-zA-Z_]
????????\W????匹配除英文字母、數(shù)字和下劃線以外任何一個(gè)字符;等價(jià)于[^0-9a-zA-Z_]
????????\s? ? ? 匹配一個(gè)空白字符;等價(jià)于[\f\t\v]???
????????\S? ? ? 匹配除空白字符以外任何一個(gè)字符;等價(jià)于[^\f\t\v]
????????\f? ? ? ?匹配一個(gè)換頁符等價(jià)于?\x0c?或?\cL
? ? ? ? \n? ? ? 匹配一個(gè)換行符;等價(jià)于?\x0a?或?\cJ
? ? ? ? \r? ? ? ?匹配一個(gè)回車符等價(jià)于\x0d?或?\cM
????????\t? ? ? ?匹配一個(gè)制表符;等價(jià)于?\x09\或\cl
????????\v? ? ? 匹配一個(gè)垂直制表符;等價(jià)于\x0b或\ck
????????\oNN????匹配一個(gè)八進(jìn)制數(shù)字
????????\xNN? ? ?匹配一個(gè)十六進(jìn)制數(shù)字
????????\cC? ? ? ?匹配一個(gè)控制字符
模式修正符(Pattern Modifiers)
????????模式修正符在忽略大小寫、匹配多行中使用特別多,掌握了這一個(gè)修正符,往往能解決我們遇到的很多問題。
????????i?????-可同時(shí)匹配大小寫字母
????????M?????-將字符串視為多行
????????S?????-將字符串視為單行,換行符做普通字符看待,使“.”匹配任何字符
????????X?????-模式中的空白忽略不計(jì)?
????????U?????-匹配到最近的字符串
????????e?????-將替換的字符串作為表達(dá)使用
? ? ? ?例子:/apple/i匹配“apple”或“Apple”等等,忽略大小寫。
PCRE庫的安裝(linux)
PCRE官網(wǎng)地址:http://www.pcre.org/
安裝包下載地址:https://sourceforge.net/projects/pcre/files/pcre/
解壓安裝參考:linux 下安裝 tar.gz包
PCRE庫的使用
1.PCRE庫的函數(shù)接口
PCRE共提供了19個(gè)接口函數(shù)。我們這里只介紹了幾個(gè)主要和常用的接口函數(shù),其中前四個(gè)函數(shù)是我們調(diào)用PCRE最主要使用的接口。
1.pcre_compile pcre *pcre_compile(const char *pattern, int options,const char **errptr, int *erroffset,const unsigned char *tableptr); 功能:將一個(gè)正則表達(dá)式編譯成一個(gè)內(nèi)部表示,在匹配多個(gè)字符串時(shí),可以加速匹配。 參數(shù):pattern: 正則表達(dá)式options: 用來指定編譯時(shí)的一些選項(xiàng)(選0,或者其他參數(shù)選項(xiàng))errptr: 出錯(cuò)信息erroffset:出錯(cuò)位置tableptr: 用來指定一個(gè)字符數(shù)組,一般情況設(shè)置為NULL, 使用缺省的字符表 返回值:被編譯好的正則表達(dá)式的pcre內(nèi)部表示 例子: 2.pcre_compile2 pcre *pcre_compile2(const char *pattern, int options,int *errorcodeptr,const char **errptr, int *erroffset,const unsigned char *tableptr); 功能:其同pcre_compile功能一樣只是多一個(gè)參數(shù)errorcodeptr。 參數(shù): errorcodeptr:存放出錯(cuò)碼 3. pcre_exec int pcre_exec(const pcre *code, const pcre_extra *extra,const char *subject, int length, int startoffset,int options, int *ovector, int ovecsize); 功能:用來檢查某個(gè)字符串是否與指定的正則表達(dá)式匹配 參數(shù): code, 編譯好的正則表達(dá)結(jié)構(gòu)的指針extra, 用來向pcre_exec傳一些額外的數(shù)據(jù)信息的結(jié)構(gòu)的指針,可以為NULLsubject, 需要匹配的字符串length, 匹配的字符串長(zhǎng)度startoffset, 匹配的開始位置options, 選項(xiàng)位ovector, 用來返回匹配位置偏移量的數(shù)組ovecsize, 數(shù)組大小 返回值:匹配成功返回非負(fù)數(shù),匹配返回負(fù)數(shù) 4.pcre_study pcre_extra *pcre_study(const pcre *code, int options,const char **errptr); 功能:對(duì)編譯的模式進(jìn)行學(xué)習(xí),提取可以加速匹配過程的信息。 參數(shù): code, 編譯好的正則表達(dá)結(jié)構(gòu)的指針options, 選項(xiàng)位errptr, 出錯(cuò)消息 5.pcre_version char *pcre_version(void) 功能:返回PCRE的版本信息 6.pcre_config int pcre_config(int what, void *where) 功能:查詢當(dāng)前PCRE版本中使用的選項(xiàng)信息 參數(shù): what ? 選項(xiàng)名where??存儲(chǔ)結(jié)果的位置 7.pcre_maketables const unsigned char *pcre_maketables(void) 功能:生成一個(gè)字符表,表中每一個(gè)元素的值不大于256,可以用它傳給pcre_compile()替換掉內(nèi)建的字符表。2.PCRE使用過程
? ?PCRE/PCRE++使用注意事項(xiàng)
(1)使用pcre請(qǐng)包含pcre.h頭文件
(2)使用pcre_compile, pcre_exec后,記得調(diào)用pcre_free釋放內(nèi)存,以免造成內(nèi)存泄露
(3)使用pcre編譯的時(shí)候需要依賴libpcre.a(apt-get install libpcre3 libpcre3-dev)
使用PCRE的過程。主要分三步,第一步編譯正則表達(dá)式;第二匹配正則表達(dá)式;第三步釋放正則表達(dá)式。
1.編譯正則表達(dá)式
為了提高效率,在將一個(gè)字符串與正則表達(dá)式進(jìn)行比較之前,首先要用pcre_compile() /pcre_compile2()?函數(shù)對(duì)它時(shí)行編譯,轉(zhuǎn)化成PCRE引擎能夠識(shí)別的結(jié)構(gòu)(struct real_pcre)。
這里還可以調(diào)用pcre_study()函數(shù),對(duì)編譯后的正則表達(dá)式結(jié)構(gòu)(struct real_pcre)時(shí)行分析和學(xué)習(xí),學(xué)習(xí)的結(jié)果是一個(gè)數(shù)據(jù)結(jié)構(gòu)(struc pcre_extra),這個(gè)數(shù)據(jù)結(jié)構(gòu)連同編譯后的規(guī)則(struct real_pcre)可以一起送給pcre_exec單元進(jìn)行匹配。
2.?匹配正則表達(dá)式
一旦用函數(shù)pcre_compile() /pcre_compile2()成功地編譯了正則表達(dá)式,接下來就可以調(diào)用pcre_exec()函數(shù)完成模式匹配。根據(jù)正則表達(dá)式到指定的字符串中進(jìn)行查找和匹配,并輸出匹配的結(jié)果。
3.?釋放正則表達(dá)式
無論什么時(shí)候,當(dāng)不再需要已經(jīng)編譯過的正則表達(dá)式時(shí),都應(yīng)該調(diào)用函數(shù)free()將其釋放,以免產(chǎn)生內(nèi)在泄漏。
?
3.PCRE實(shí)例
#include <pcre.h> #include <stdio.h> #include <string.h>int main(int argc, char ** argv) {if (argc != 3){ printf("Usage: %s pattern text\n", argv[0]);return 1;} const char * pPattern = argv[1];const char * pText = argv[2];const char * pErrMsg = NULL;pcre * pPcre = NULL;int nOffset = -1; if (NULL == (pPcre = pcre_compile(pPattern, 0, &pErrMsg, &nOffset, NULL))){ printf("ErrMsg=%s, Offset=%d\n", pErrMsg, nOffset);return 1;} else{ if (pcre_exec(pPcre, NULL, pText, strlen(pText), 0, 0, NULL, 0) < 0){ printf("%s doesn't match %s\n", pText, pPattern);} else{ printf("%s matches %s\n", pText, pPattern);}} }注意,如果你在編譯時(shí)出現(xiàn)如下提示:沒有定義pcre.h文件里面的函數(shù)時(shí),是因?yàn)闆]有鏈接到庫文件里,這時(shí)可以能過添加一個(gè)lpcre即可。然后重新編譯便可成功。
運(yùn)行結(jié)果:
參考文章
pcre使用例子
深入淺出C/C++中的正則表達(dá)式庫(三)——PCRE, PCRE++
總結(jié)
- 上一篇: Android动态广播添加权限
- 下一篇: Lucas–Kanade method(