1. 程式人生 > >C/C++高效的正則表示式庫PCRE/PCRE++

C/C++高效的正則表示式庫PCRE/PCRE++

寫在前面:本文是《深入淺出C/C++中的正則表示式庫》系列的第三篇,本文的主要內容是介紹PCRE和PCRE++,因為它們兩個是很有淵源的,所以放在一起講。

1. 什麼是PCRE? 什麼是PCRE++?
PCRE,全稱是Perl Compatible Regular Expressions。從名字我們可以看出PCRE庫是與Perl中正則表示式相相容的一個正則表示式庫。PCRE是免費開源的庫,它是由C語言實現的,這裡是它的官方主頁:http://www.pcre.org/,感興趣的朋友可以在這裡瞭解更多的內容。
要得到PCRE庫,可以從這裡下載:http://sourceforge.net/projects/pcre/files/

PCRE++是一個對PCRE庫的C++封裝,它提供了更加方便、易用的C++介面。這裡是它的官方主頁:http://www.daemon.de/PCRE,感興趣的朋友可以在這裡瞭解更多的內容。
要得到PCRE++庫,可以從這裡下載:http://www.daemon.de/PcreDownload

2. PCRE介面介紹
(1). pcre_compile

12345678910
pcre *pcre_compile(constchar*pattern,int options,constchar**errptr,int*erroffset,constunsignedchar*tableptr);功能:編譯指定的正則表示式
引數:pattern,輸入引數,將要被編譯的字串形式的正則表示式 options,輸入引數,用來指定編譯時的一些選項 errptr,輸出引數,用來輸出錯誤資訊 erroffset,輸出引數,pattern中出錯位置的偏移量 tableptr,輸入引數,用來指定字元表,一般情況用NULL,使用預設的字元表返回值:被編譯好的正則表示式的pcre內部表示結構

(2). pcre_exec

12345678910111213
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,輸入引數,用來返回匹配位置偏移量的陣列的最大大小返回值:匹配成功返回非負數,匹配返回負數

3. PCRE++介面介紹
PCRE++把PCRE庫封裝成了兩個類,一個是RE_Options, 用來指定匹配選項,一個是RE,用來提供匹配相關的介面。RE_options類在這裡我就不介紹了,我主要介紹一下RE類:
(1)RE的建構函式傳入正則表示式,並在建構函式中呼叫Init函式,將該正則表達進行編譯
(2)RE的pattern()成員用來得到初始傳入的正則表示式字串
(3)RE的error()成員用來得到匹配過程中的出錯資訊
(4)RE的FullMatch()成員用來判斷某字串整體是否匹配指定正則表示式
(5)RE的PartialMatch()成員用來判斷某字串的部分是否匹配指定正則表示式

4. PCRE/PCRE++使用注意事項
(1)使用pcre請包含pcre.h標頭檔案
(2)使用pcre_compile, pcre_exec後,記得呼叫pcre_free釋放記憶體,以免造成記憶體洩露
(3)使用pcre編譯的時候需要依賴libpcre.a
(4)使用pcre++請包含pcrecpp.h標頭檔案
(5)使用pcre++,RE類的解構函式會自動釋放相關記憶體,因此不用擔心記憶體洩露
(6)使用pcre++編譯的時候需要依賴libpcrecpp.a
(7)使用pcrecpp要使用pcrecpp名稱空間

5. PCRE使用舉例
下面是例程:

1234567891011121314151617181920212223242526272829303132333435
#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]);return1;}constchar* pPattern = argv[1];constchar* pText = argv[2];constchar* 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);return1;}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);}}}

下面是執行結果:

123456
[email protected]-ubuntu:~/Program$!g++
g++-lpcre TestPcre.cpp -o pcre
[email protected]-ubuntu:~/Program$./pcre "http:\/\/.*\.qq\.com""http://www.qq.com"
http://www.qq.com matches http:\/\/.*\.qq\.com
[email protected]-ubuntu:~/Program$./pcre "http:\/\/.*\.qq\.com""http://www.qqq.com"
http://www.qqq.com doesn't match http:\/\/.*\.qq\.com

6. PCRE++使用舉例
下面是例程:

12345678910111213141516171819202122232425
#include<iostream>#include<pcrecpp .h>int main(int argc,char** argv){if(argc !=3){   
        std::cerr<<"Usage: "<< argv[0]<<" pattern text\n";return1;}   
 
    pcrecpp::RE oPattern(argv[1]);if(oPattern.FullMatch(argv[2])){   
        std::cout<< argv[2]<<" fully matches "<< argv[1]<<"\n";}elseif(oPattern.PartialMatch(argv[2])){   
        std::cout<< argv[2]<<" partially matches "<< argv[1]<<"\n";}else{   
        std::cout<< argv[2]<<" dose not match "<< argv[1]<<"\n";}}

下面是執行結果:

123456789
[email protected]-ubuntu:~/Program$ g++TestPcreCpp.cpp -lpcrecpp -o pcrecpp
[email protected]-ubuntu:~/Program$./pcrecpp 
Usage:./pcrecpp pattern text
[email protected]-ubuntu:~/Program$./pcrecpp "http:\/\/.*\.qq\.com""http://www.qq.com"
http://www.qq.com fully matches http:\/\/.*\.qq\.com
[email protected]-ubuntu:~/Program$./pcrecpp "http:\/\/.*\.qq\.com""http://www.qq.comiii"
http://www.qq.comiii partially matches http:\/\/.*\.qq\.com
[email protected]-ubuntu:~/Program$./pcrecpp "http:\/\/.*\.qq\.com""http://www.qqq.comiii"
http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com

以上即是關於PCRE和PCRE++庫介紹的全部內容,由於內容比較多,我只介紹了一些關鍵的介面及其用法,如果讀者朋友想更加深入的瞭解其它的介面,可以參考我上面提到的官方網站,另外linux下的manual也是很好的參考資料。在shell下執行man pcre和man pcrecpp便可得到很詳細的資料。

相關推薦

C/C++高效表示式PCRE/PCRE++

寫在前面:本文是《深入淺出C/C++中的正則表示式庫》系列的第三篇,本文的主要內容是介紹PCRE和PCRE++,因為它們兩個是很有淵源的,所以放在一起講。 1. 什麼是PCRE? 什麼是PCRE++? PCRE,全稱是Perl Compatible Regular Expressions。從名字我們可以看出

C++11新特性(74)-表示式(regular-expression library)

正則表示式(regular expression)是一種描述字元序列的方法,從C++11起,C++正則表示式庫(regular-expression library)成為新標準庫的一部分。 由於正則表示式本身就是一個非常龐大的系統,本文只介紹C++中使用正則表示式的小例子,淺嘗輒止。 基

[C/C++11]_[初級]_[使用表示式regex]

場景 正則表示式在處理非常量字串查詢,替換時能很省事,如果稍微複雜點的字串匹配, 沒有正則表示式還真做不出來. C++11 為我們提供了正則表示式庫. 使用起來比boost的正則庫方便. 搞Java

RE2,C++表示式實戰

RE2簡介 RE2是,一個高效、原則性的正則表示式庫,由Rob Pike和Russ Cox兩位來自google的大牛用C++實現。他倆同時也是Go語言的主導者。Go語言中的regexp正則表示式包,也是RE2的Go實現。 RE2是,一個快速、安全,執行緒友好,P

[C/C++11]_[初級]_[使用表示式進行分組查詢]

場景 1.正則表示式在查詢替換字串資料時效率很高, 可以節省很多不必要的查詢程式碼. 特別是對字串分組的查詢, 可以說如果沒有正則表示式,查詢分組裡的字串需要寫很多額外的程式碼,還不一定準確. 2.查詢並替換XML標籤是比較常見的需求, 比如過濾掉HTML標

C++】regex 表示式

    正則表示式是一種描述字元序列的方法,是C++11標準庫中新加入的強大工具。正則表示式是一種用於字串處理的微型語言,適用於一些與字串相關的操作。C++11包含了對以下幾種語法的支援:ECMAScript、basic、extended、awk、grep和egrep。C++

C# 中使用表示式 Regex.Matches方法的幾個應用

用於正則表示式的 Regex.Matches靜態方法的幾種用法: //①正則表示式 = > 匹配字串 string Text = @"This is a book , this is my book , Is not I

C#/JS 利用表示式 替換/刪除 img 裡面的 width height

JS: function test() { var str = "<img title=\"\" alt=\"\" align=\"\" src=\"/kindeditor/attached/image/20161214/20161214162

C# Regex 深入表示式

###匹配字串——從一段資料中提取自己所需要的資料資訊### Regex regex = new Regex(正則表示式);Regex regex = new Regex(正則表示式, RegexOptions.None | RegexOptions.IgnoreCase |

C#】利用表示式判斷輸入是否為純數字、容器類

容器類、正則表示式在幾乎所有程式語言都存在的東西。很常用也很使用。下面用如下的一個控制檯小程式說明C#的正則表示式與容器類的應用。 開始直接輸出在C#定義好的資料字典Dictionary,這就是Java與Python的HashMap 之後定義一個存int的List,讓使用者

C#中利用表示式檢測檔案路徑的合法性

專案中少不了讀取或設定檔案路徑的功能,如何才能對輸入的路徑是否合法進行判斷呢?用正則表示式是個不錯的方式。我們都知道檔案路徑的字串一般格式,首先是碟符,一般是abcde等字幕,碟符後用冒號隔開,然後用“\”隔開各層資料夾,如:F:\Funny\22\renxi,

C#中的表示式物件[轉載]

Console.WriteLine(Regex.Match(strTarget,strRegex1,RegexOptions.IgnoreCase).Groups[1].Captures.Count);

C#中的表示式使用

最初它是在UNIX環境中開發的,與Perl一起使用得比較多。Microsoft把它移植到Windows中,到目前為止在指令碼語言中用得比較多。 注意,.NET正則表示式引擎是為相容Perl 5的正則表示式而設計的,但有一些新特性。 也就是說,.net遵守了perl的正則表示式

C# 中使用表示式驗證電話號碼、手機號、身份證號

驗證電話號碼的主要程式碼如下: public bool IsTelephone(stringstr_telephone) { returnSystem.Text.RegularExpressions.Regex.IsMatch(str_telephone,@

windos下編譯表示式pcre

最近寫東西用到正則表示式到網上找了一大圈沒有發現好的,因為我用的是c++而且不想用ATL。最終發現c寫的pcre挺好而且權威,php和python都用的它。 言歸正轉下面說一下windows下編譯pcre的步驟: 2.下載完之後新建一個lib後者dll工程之後把pcre-

C#中的表示式(定位元字元)

定位元字元 我們經常在正則表示式字串前面加上@字元,這樣不讓編譯器去解析其中的轉義字元,而作為正則表示式的語法(元字元)存在。 字元 說明 \b 匹配單詞的開始或結束 \B 匹配非單詞的開

C#中使用表示式驗證電話號碼、手機號、身份證號(轉)

驗證電話號碼的主要程式碼如下:    public bool IsTelephone(stringstr_telephone)    {    returnSystem.Text.RegularExpressions.Regex.IsMatch(str_telephone,@"^(\d{3,4}-)?\d

C#拾遺】——表示式RegEx

前提     公司內部推行安全制度,要求密碼必須是八位以上,而且必有至少包含一個小寫或者大寫字母,數字,特殊字元,面對這樣的密碼,感覺領導也是夠操心的了啊。在公司小編真是閒啊,所以動手實現了一下,後來

C#語法:表示式 --Trim()的實現

正則表示式匹配輸入文字的模式 常用元字元 程式碼 說明 .                      匹配除換行符以外的任意字元。 \w 匹配字母或數字或下劃線或漢字。 \s  匹配任意的空白符。 \d 匹配數字。 \b 匹配單詞的開始或結束。

Re ——表示式

regular expression, regex, RE 正則表示式是用來簡潔表達一組字串的表示式 正則表示式的常用操作符 操作符 說明 例項 . 表示任何單個字元