
【基本簡介】
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達(dá)式庫。這些在執(zhí)行正規(guī)表達(dá)式模式匹配時用與Perl 5同樣的語法和語義是很有用的。Boost太龐大了,使用boost regex后,程序的編譯速度明顯變慢。測試了一下,同樣一個程序,使用boost::regex編譯時需要3秒,而使用pcre不到1秒。因此改用pcre來解決C語言中使用正則表達(dá)式的問題。
【官方簡介】
PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達(dá)式)是一個用C語言編寫的正則表達(dá)式函數(shù)庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數(shù)庫,比Boost之類的正則表達(dá)式庫小得多。PCRE十分易用,同時功能也很強(qiáng)大,性能超過了POSIX正則表達(dá)式庫和一些經(jīng)典的正則表達(dá)式庫。和Boost正則表達(dá)式庫的比較顯示,雙方的性能相差無幾,PCRE在匹配簡單字符串時更快,Boost則在匹配較長字符串時勝出---但兩者差距很小,考慮到PCRE的大小和易用性,我們可以認(rèn)為PCRE更值得考慮。
PCRE被廣泛使用在許多開源軟件之中,最著名的莫過于Apache HTTP服務(wù)器和PHP腳本語言、R腳本語言,此外,正如從其名字所能看到的,PCRE也是perl語言的缺省正則庫。
PCRE是用C語言實現(xiàn)的,其C++實現(xiàn)版本是PCRE++。
PCRE最新的版本是8.33,可以在其官方網(wǎng)站下載,官網(wǎng)地址見擴(kuò)展閱讀部分。

【軟件定義】
PCRE正則表達(dá)式的定義用于描述字符排列和匹配模式的一種語法規(guī)則。它主要用于字符串的模式分割、匹配、查找及替換操作。正則中重要的幾個概念有:元字符、轉(zhuǎn)義、模式單元(重復(fù))、反義、引用和斷言。
常用的元字符(Meta-character)
\A :匹配字符串串首的原子
\Z :匹配字符串串尾的原子
\b :匹配單詞的邊界/\bis/匹配頭為is的字符串/is\b/ 匹配尾為is的字符串 /\bis\b/ 定界
\B :匹配除單詞邊界之外的任意字符 /\Bis/ 匹配單詞“This”中的“is”
\d :匹配一個數(shù)字;等價于[0-9]
\D :匹配除數(shù)字以外任何一個字符;等價于[^0-9]
\w :匹配一個英文字母、數(shù)字或下劃線;等價于[0-9a-zA-Z_]
\W :匹配除英文字母、數(shù)字和下劃線以外任何一個字符;等價于[^0-9a-zA-Z_]
\s :匹配一個空白字符;等價于[\f\t\v]
\S: 匹配除空白字符以外任何一個字符;等價于[^\f\t\v]
\f: 匹配一個換頁符等價于 \x0c 或 \cL
匹配一個換行符;等價于 \x0a 或 \cJ
匹配一個回車符等價于\x0d 或 \cM
\t :匹配一個制表符;等價于 \x09\或\cl
\v :匹配一個垂直制表符;等價于\x0b或\ck
\oNN: 匹配一個八進(jìn)制數(shù)字
\xNN :匹配一個十六進(jìn)制數(shù)字
\cC :匹配一個控制字符

模式修正符(Pattern Modifiers)
模式修正符在忽略大小寫、匹配多行中使用特別多,掌握了這一個修正符,往往能解決我們遇到的很多問題。
i -可同時匹配大小寫字母
M -將字符串視為多行
S -將字符串視為單行,換行符做普通字符看待,使“.”匹配任何字符
X -模式中的空白忽略不計
U -匹配到最近的字符串
e -將替換的字符串作為表達(dá)使用
格式:/apple/i匹配“apple”或“Apple”等,忽略大小寫。 當(dāng)然這里還有很多種情況,在這里就不一一描述出來了。

【函數(shù)原型】
PCRE是一個NFA正則引擎,不然不能提供完全與Perl一致的正則語法功能。但它同時也實現(xiàn)了DFA,只是滿足數(shù)學(xué)意義上的正則。PCRE提供了19個接口函數(shù)。
這里只介紹了幾個主要和常用的接口函數(shù),另外的可通過PCRE源碼文檔進(jìn)行了解。注意,使用PCRE主要是使用下面介紹的前四個函數(shù),對這四個函數(shù)有了了解,使用PCRE庫的時候就會簡單很多了。
下面所講的函數(shù),都在PCRE頭文件上定義申明:#include 。
1.pcre_compile
函數(shù)原型:
pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr)
功能:將一個正則表達(dá)式編譯成一個內(nèi)部表示,在匹配多個字符串時,可以加速匹配。其同pcre_compile2功能一樣只是缺少一個參數(shù)errorcodeptr。
參數(shù)說明:
pattern正則表達(dá)式
options 為0,或者其他參數(shù)選項
errptr 出錯消息
erroffset 出錯位置
tableptr 指向一個字符數(shù)組的指針,可以設(shè)置為空NULL。

2. pcre_compile2
函數(shù)原型:
pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr)
功能:將一個正則表達(dá)式編譯成一個內(nèi)部表示,在匹配多個字符串時,可以加速匹配。其同pcre_compile功能一樣只是多一個參數(shù)errorcodeptr。
參數(shù):
pattern 正則表達(dá)式
options 為0,或者其他參數(shù)選項
errorcodeptr 存放出錯碼
errptr 出錯消息
erroffset 出錯位置
tableptr 指向一個字符數(shù)組的指針,可以設(shè)置為空NULL。

3. pcre_exec
函數(shù)原型:
int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize)
功能:使用編譯好的模式進(jìn)行匹配,采用與Perl相似的算法,返回匹配串的偏移位置。
參數(shù):
code 編譯好的模式
extra 指向一個pcre_extra結(jié)構(gòu)體,可以為NULL
subject 需要匹配的字符串
length 匹配的字符串長度(Byte)
startoffset 匹配的開始位置
options 選項位
ovector 指向一個結(jié)果的整型數(shù)組
ovecsize 數(shù)組大小。

4. pcre_study
函數(shù)原型:
pcre_extra *pcre_study(const pcre *code, int options, const char **errptr)
功能:對編譯的模式進(jìn)行學(xué)習(xí),提取可以加速匹配過程的信息。
參數(shù):
code 已編譯的模式
options選項
errpt 出錯消息
5. pcre_version
函數(shù)原型:
char *pcre_version(void)
功能:返回PCRE的版本信息。
參數(shù):無。

6. pcre_config
函數(shù)原型:
int pcre_config(int what, void *where)
功能:查詢當(dāng)前PCRE版本中使用的選項信息。
參數(shù):
what 選項名
where 存儲結(jié)果的位置
7.pcre_maketables
函數(shù)原型:
const unsigned char *pcre_maketables(void)
功能:生成一個字符表,表中每一個元素的值不大于256,可以用它傳給pcre_compile()替換掉內(nèi)建的字符表。
參數(shù):無
【安裝教程】
檢查系統(tǒng)里是否安裝了pcre軟件1、系統(tǒng)里是否安裝了pcre軟件,我們可以使用rpm 命令進(jìn)行查詢,如下命令
rpm -qa pcre 如果沒有顯示則表示還沒有安裝,如果顯示了,剛表示安裝了。如下圖

2、我們要編譯升級到新版本的pcre,首先把系統(tǒng)里的舊版刪除了,然后再進(jìn)行安裝
使用如下命令進(jìn)行卸載它
rpm -e --nodeps pcre
如圖:

下載并安裝pcre
1.從起點軟件園下載pcre源碼

2.上傳到服務(wù)器的/usr/local/src目錄下

3.解壓pcre

4.切換到pcre目錄下,進(jìn)行編譯
cd pcre-8.37
./configure --prefix=/usr/local/pcre-8.37 --libdir=/usr/local/lib/pcre --includedir=/usr/local/include/pcre
make && make install


5.查看對應(yīng)的目錄是否生成.
/usr/local/pcre-8.37
/usr/local/lib/pcre
/usr/local/include/pcre

6.更新動態(tài)鏈接庫數(shù)據(jù)
echo /usr/local/lib/pcre >> /etc/ld.so.conf
ldconfig -v

總結(jié)
因為低版本的pcre版本不能滿足需求,所以才要編譯高版本的pcre方能使用。以上是個人編譯安裝pcre軟件的過程,不需要太多的編譯安裝參數(shù),其實是很簡單的,不過安裝前一個文件不能少,所以還得要認(rèn)真思考下。本文已經(jīng)講述完畢了,如果有需要可以聯(lián)系我。
【使用方法】
使用pcre編寫C或C++程序,然后編譯。對于C程序,編譯命令為:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcre file.c
對于C程序,編譯命令為:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcrecpp file.cpp
也可用apt直接安裝:
apt-cache search pcre 查找pcre
下面只安裝pcrecpp
apt-get install libpcre++-dev 安裝pcrecpp開發(fā)文件
apt-get install libpcre++0 安裝pcrecpp庫文件

































