日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则之PCRE库

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则之PCRE库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

什么是PCRE庫?

1.PCRE庫簡介

2.PCRE正則基礎知識

PCRE庫的安裝(linux)

PCRE庫的使用

1.PCRE庫的函數接口

2.PCRE使用過程

3.PCRE實例

參考文章


什么是PCRE庫?

1.PCRE庫簡介

PCRE(Perl Compatible Regular Expressions):perl語言兼容正則表達式。PCRE是一個用C語言編寫的正則表達式函數庫。PCRE是一個輕量級的函數庫,比Boost之中的正則表達式庫小得多。PCRE十分易用,同時功能也很強大,性能超過了POSIX正則表達式庫和一些經典的正則表達式庫。
????????和Boost正則表達式庫的比較顯示,雙方的性能相差無幾,PCRE在匹配簡單字符串時更快,Boost則在匹配較長字符串時勝出---但兩者差距很小,考慮到PCRE的大小和易用性,我們可以認為PCRE更值得考慮。
????????PCRE被廣泛使用在許多開源軟件之中,最著名的莫過于Apache HTTP服務器和PHP腳本語言、R腳本語言,此外,正如從其名字所能看到的,PCRE也是perl語言的缺省正則庫。
????????PCRE是用C語言實現的,其C++實現版本叫PCRE++。

2.PCRE正則基礎知識

PCRE正則表達式主要用于字符串的模式分割、匹配、查找及替換操作。
正則中重要的幾個概念有:元字符、轉義、模式單元(重復)、反義、引用和斷言。我們簡單列一下常用字符:

常用的元字符(Meta-character)
????????元字符????說明
????????\A?????匹配字符串串首的原子
????????\Z?????匹配字符串串尾的原子
????????\b?????匹配單詞的邊界/\bis/匹配頭為is的字符串/is\b/?匹配尾為is的字符串?/\bis\b/?定界
????????\B? ? ?匹配除單詞邊界之外的任意字符?? /\Bis/???匹配單詞“This”中的“is”
????????\d? ? ? 匹配一個數字;等價于[0-9]
????????\D?????匹配除數字以外任何一個字符;等價于[^0-9]
????????\w?????匹配一個英文字母、數字或下劃線;等價于[0-9a-zA-Z_]
????????\W????匹配除英文字母、數字和下劃線以外任何一個字符;等價于[^0-9a-zA-Z_]
????????\s? ? ? 匹配一個空白字符;等價于[\f\t\v]???
????????\S? ? ? 匹配除空白字符以外任何一個字符;等價于[^\f\t\v]
????????\f? ? ? ?匹配一個換頁符等價于?\x0c?或?\cL
? ? ? ? \n? ? ? 匹配一個換行符;等價于?\x0a?或?\cJ
? ? ? ? \r? ? ? ?匹配一個回車符等價于\x0d?或?\cM
????????\t? ? ? ?匹配一個制表符;等價于?\x09\或\cl
????????\v? ? ? 匹配一個垂直制表符;等價于\x0b或\ck
????????\oNN????匹配一個八進制數字
????????\xNN? ? ?匹配一個十六進制數字
????????\cC? ? ? ?匹配一個控制字符

模式修正符(Pattern Modifiers)
????????模式修正符在忽略大小寫、匹配多行中使用特別多,掌握了這一個修正符,往往能解決我們遇到的很多問題。
????????i?????-可同時匹配大小寫字母
????????M?????-將字符串視為多行
????????S?????-將字符串視為單行,換行符做普通字符看待,使“.”匹配任何字符
????????X?????-模式中的空白忽略不計?
????????U?????-匹配到最近的字符串
????????e?????-將替換的字符串作為表達使用

? ? ? ?例子:/apple/i匹配“apple”或“Apple”等等,忽略大小寫。

PCRE庫的安裝(linux)

PCRE官網地址:http://www.pcre.org/

安裝包下載地址:https://sourceforge.net/projects/pcre/files/pcre/

解壓安裝參考:linux 下安裝 tar.gz包

PCRE庫的使用

1.PCRE庫的函數接口

PCRE共提供了19個接口函數。我們這里只介紹了幾個主要和常用的接口函數,其中前四個函數是我們調用PCRE最主要使用的接口。

1.pcre_compile pcre *pcre_compile(const char *pattern, int options,const char **errptr, int *erroffset,const unsigned char *tableptr); 功能:將一個正則表達式編譯成一個內部表示,在匹配多個字符串時,可以加速匹配。 參數:pattern: 正則表達式options: 用來指定編譯時的一些選項(選0,或者其他參數選項)errptr: 出錯信息erroffset:出錯位置tableptr: 用來指定一個字符數組,一般情況設置為NULL, 使用缺省的字符表 返回值:被編譯好的正則表達式的pcre內部表示 例子: 2.pcre_compile2 pcre *pcre_compile2(const char *pattern, int options,int *errorcodeptr,const char **errptr, int *erroffset,const unsigned char *tableptr); 功能:其同pcre_compile功能一樣只是多一個參數errorcodeptr。 參數: errorcodeptr:存放出錯碼 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); 功能:用來檢查某個字符串是否與指定的正則表達式匹配 參數: code, 編譯好的正則表達結構的指針extra, 用來向pcre_exec傳一些額外的數據信息的結構的指針,可以為NULLsubject, 需要匹配的字符串length, 匹配的字符串長度startoffset, 匹配的開始位置options, 選項位ovector, 用來返回匹配位置偏移量的數組ovecsize, 數組大小 返回值:匹配成功返回非負數,匹配返回負數 4.pcre_study pcre_extra *pcre_study(const pcre *code, int options,const char **errptr); 功能:對編譯的模式進行學習,提取可以加速匹配過程的信息。 參數: code, 編譯好的正則表達結構的指針options, 選項位errptr, 出錯消息 5.pcre_version char *pcre_version(void) 功能:返回PCRE的版本信息 6.pcre_config int pcre_config(int what, void *where) 功能:查詢當前PCRE版本中使用的選項信息 參數: what ? 選項名where??存儲結果的位置 7.pcre_maketables const unsigned char *pcre_maketables(void) 功能:生成一個字符表,表中每一個元素的值不大于256,可以用它傳給pcre_compile()替換掉內建的字符表。

2.PCRE使用過程

? ?PCRE/PCRE++使用注意事項
(1)使用pcre請包含pcre.h頭文件
(2)使用pcre_compile, pcre_exec后,記得調用pcre_free釋放內存,以免造成內存泄露
(3)使用pcre編譯的時候需要依賴libpcre.a(apt-get install libpcre3 libpcre3-dev

使用PCRE的過程。主要分三步,第一步編譯正則表達式;第二匹配正則表達式;第三步釋放正則表達式。

1.編譯正則表達式
為了提高效率,在將一個字符串與正則表達式進行比較之前,首先要用pcre_compile() /pcre_compile2()?函數對它時行編譯,轉化成PCRE引擎能夠識別的結構(struct real_pcre)。
這里還可以調用pcre_study()函數,對編譯后的正則表達式結構(struct real_pcre)時行分析和學習,學習的結果是一個數據結構(struc pcre_extra),這個數據結構連同編譯后的規則(struct real_pcre)可以一起送給pcre_exec單元進行匹配。

2.?匹配正則表達式
一旦用函數pcre_compile() /pcre_compile2()成功地編譯了正則表達式,接下來就可以調用pcre_exec()函數完成模式匹配。根據正則表達式到指定的字符串中進行查找和匹配,并輸出匹配的結果。

3.?釋放正則表達式
無論什么時候,當不再需要已經編譯過的正則表達式時,都應該調用函數free()將其釋放,以免產生內在泄漏。
?

3.PCRE實例

#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);}} }

注意,如果你在編譯時出現如下提示:沒有定義pcre.h文件里面的函數時,是因為沒有鏈接到庫文件里,這時可以能過添加一個lpcre即可。然后重新編譯便可成功。

運行結果:

參考文章

pcre使用例子

深入淺出C/C++中的正則表達式庫(三)——PCRE, PCRE++

總結

以上是生活随笔為你收集整理的正则之PCRE库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。