PCRE函數簡介和使用示例


PCRE是一個NFA正則引擎,不然不能提供完全與Perl一致的正則語法功能。但它同時也實現了DFA,只是滿足數學意義上的正則。

?

PCRE提供了19個接口函數,為了簡單介紹,使用PCRE內帶的測試程序(pcretest.c)示例用法。

1. pcre_compile

???????原型:

?????????#include <pcre.h>

pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);

功能:將一個正則表達式編譯成一個內部表示,在匹配多個字符串時,可以加速匹配。其同pcre_compile2功能一樣只是缺少一個參數errorcodeptr

參數:

pattern????正則表達式

options?????為0,或者其他參數選項

???????errptr???????出錯消息

????????erroffset??出錯位置

tableptr???指向一個字符數組的指針,可以設置為空NULL

示例:

L1720?????re = pcre_compile((char *)p, options, &error, &erroroffset, tables);

?

2. pcre_compile2

???????原型:

#include <pcre.h>

pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr);

功能:將一個正則表達式編譯成一個內部表示,在匹配多個字符串時,可以加速匹配。其同pcre_compile功能一樣只是多一個參數errorcodeptr

參數:

pattern????正則表達式

options?????為0,或者其他參數選項

errorcodeptr????存放出錯碼

???????errptr???????出錯消息

????????erroffset??出錯位置

tableptr???指向一個字符數組的指針,可以設置為空NULL

?

3. pcre_config

???????原型:

#include <pcre.h>

int pcre_config(int what, void *where);

功能:查詢當前PCRE版本中使用的選項信息。

參數:

what?????????選項名

where???????存儲結果的位置

示例:

Line1312?(void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);

?

4. pcre_copy_named_substring

???????原型:

#include <pcre.h>

int pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int buffersize);

功能:根據名字獲取捕獲的字串。

參數:

code????????????????????????????成功匹配的模式

subject???????????????匹配的串

ovector??????????????pcre_exec()?使用的偏移向量

stringcount???pcre_exec()的返回值

stringname???????捕獲字串的名字

buffer?????????????????用來存儲的緩沖區

buffersize???????????????????緩沖區大小

示例:

Line2730?int rc = pcre_copy_named_substring(re, (char *)bptr, use_offsets,

????????????count, (char *)copynamesptr, copybuffer, sizeof(copybuffer));

?

5.?pcre_copy_substring

???????原型:

#include <pcre.h>

int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int buffersize);

功能:根據編號獲取捕獲的字串。

參數:

code????????????????????????????成功匹配的模式

subject???????????????匹配的串

ovector??????????????pcre_exec()?使用的偏移向量

stringcount???pcre_exec()的返回值

stringnumber???捕獲字串編號

buffer?????????????????用來存儲的緩沖區

buffersize???????????????????緩沖區大小

示例:

Line2730 int rc = pcre_copy_substring((char *)bptr, use_offsets, count,

??????????????i, copybuffer, sizeof(copybuffer));

?

6.?pcre_dfa_exec

???????原型:

#include <pcre.h>

int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize, int *workspace, int wscount);

功能:使用編譯好的模式進行匹配,采用的是一種非傳統的方法DFA,只是對匹配串掃描一次(與Perl不兼容)。

參數:

code???????????????????編譯好的模式

extra?????????指向一個pcre_extra結構體,可以為NULL

subject????需要匹配的字符串

length???????匹配的字符串長度(Byte)

startoffset????????匹配的開始位置

options?????選項位

ovector????指向一個結果的整型數組

ovecsize???數組大小

workspace????????一個工作區數組

wscount???數組大小

示例:

Line2730?count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,

??????????????options | g_notempty, use_offsets, use_size_offsets, workspace,

??????????????sizeof(workspace)/sizeof(int));

?

7.?pcre_copy_substring

???????原型:

#include <pcre.h>

int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize);

功能:使用編譯好的模式進行匹配,采用與Perl相似的算法,返回匹配串的偏移位置。。

參數:

code???????????????????編譯好的模式

extra?????????指向一個pcre_extra結構體,可以為NULL

subject????需要匹配的字符串

length???????匹配的字符串長度(Byte)

startoffset????????匹配的開始位置

options?????選項位

ovector????指向一個結果的整型數組

ovecsize???數組大小

?

8.?pcre_free_substring

???????原型:

#include <pcre.h>

void pcre_free_substring(const char *stringptr);

功能:釋放pcre_get_substring()和pcre_get_named_substring()申請的內存空間。

參數:

stringptr????????????指向字符串的指針

示例:

Line2730????????const char *substring;

int rc = pcre_get_substring((char *)bptr, use_offsets, count,

??????????????i, &substring);

……

pcre_free_substring(substring);

?

9.?pcre_free_substring_list

???????原型:

#include <pcre.h>

void pcre_free_substring_list(const char **stringptr);

功能:釋放由pcre_get_substring_list申請的內存空間。

參數:

stringptr????????????指向字符串數組的指針

示例:

Line2773????????const char **stringlist;

int rc = pcre_get_substring_list((char *)bptr, use_offsets, count,

……

pcre_free_substring_list(stringlist);

?

10.?pcre_fullinfo

???????原型:

#include <pcre.h>

int pcre_fullinfo(const pcre *code, const pcre_extra *extra, int what, void *where);

功能:返回編譯出來的模式的信息。

參數:

code??????????編譯好的模式

extra?????????pcre_study()的返回值,或者NULL

what?????????什么信息

where???????存儲位置

示例:

Line997??????????if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0)

fprintf(outfile, "Error %d from pcre_fullinfo(%d)/n", rc, option);

}

?

11.?pcre_get_named_substring

???????原型:

#include <pcre.h>

int pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, const char **stringptr);

功能:根據編號獲取捕獲的字串。

參數:

code????????????????????????????成功匹配的模式

subject???????????????匹配的串

ovector??????????????pcre_exec()?使用的偏移向量

stringcount???pcre_exec()的返回值

stringname???????捕獲字串的名字

stringptr?????存放結果的字符串指針

示例:

Line2759????????const char *substring;

int rc = pcre_get_named_substring(re, (char *)bptr, use_offsets,

????????????count, (char *)getnamesptr, &substring);

?

12.?pcre_get_stringnumber

???????原型:

#include <pcre.h>

int pcre_get_stringnumber(const pcre *code, const char *name);

功能:根據命名捕獲的名字獲取對應的編號。

參數:

code????????????????????????????成功匹配的模式

name?????????????????捕獲名字

?

13.?pcre_get_substring

???????原型:

#include <pcre.h>

int pcre_get_substring(const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr);

功能:獲取匹配的子串。

參數:

subject???????成功匹配的串

ovector???????pcre_exec()?使用的偏移向量

stringcount????pcre_exec()的返回值

stringnumber??獲取的字符串編號

stringptr??????字符串指針

?

14.?pcre_get_substring_list

???????原型:

#include <pcre.h>

int pcre_get_substring_list(const char *subject, int *ovector, int stringcount, const char ***listptr);

功能:獲取匹配的所有子串。

參數:

subject???????成功匹配的串

ovector???????pcre_exec()?使用的偏移向量

stringcount????pcre_exec()的返回值

listptr?????????????字符串列表的指針

?

15.?pcre_info

???????原型:

#include <pcre.h>

int pcre_info(const pcre *code, int *optptr, int *firstcharptr);

已過時,使用pcre_fullinfo替代。

?

16.?pcre_maketables

???????原型:

#include <pcre.h>

const unsigned char *pcre_maketables(void);

功能:生成一個字符表,表中每一個元素的值不大于256,可以用它傳給pcre_compile()替換掉內建的字符表。

參數:

示例:

Line2759?tables = pcre_maketables();

?

17.?pcre_refcount

???????原型:

#include <pcre.h>

int pcre_refcount(pcre *code, int adjust);

功能:編譯模式的引用計數。

參數:

code???????已編譯的模式

adjust??????調整的引用計數值

?

18.?pcre_study

???????原型:

#include <pcre.h>

pcre_extra *pcre_study(const pcre *code, int options, const char **errptr);

功能:對編譯的模式進行學習,提取可以加速匹配過程的信息。

參數:

code??????已編譯的模式

options????選項

errptr?????出錯消息

示例:

Line1797?extra = pcre_study(re, study_options, &error);

?

19.?pcre_version

???????原型:

#include <pcre.h>

char *pcre_version(void);

功能:返回PCRE的版本信息。

參數:

示例:

Line1384?if (!quiet) fprintf(outfile, "PCRE version %s/n/n", pcre_version());

?

程序實例:

[cpp]?view plaincopy
  1. #define?PCRE_STATIC?//?靜態庫編譯選項??
  2. #include?<stdio.h>??
  3. #include?<string.h>??
  4. #include?<pcre.h>??
  5. #define?OVECCOUNT?30?/*?should?be?a?multiple?of?3?*/??
  6. #define?EBUFLEN?128??
  7. #define?BUFLEN?1024??
  8. ??
  9. int?main()??
  10. {??
  11. ????pcre??*re;??
  12. ????const?char?*error;??
  13. ????int??erroffset;??
  14. ????int??ovector[OVECCOUNT];??
  15. ????int??rc,?i;??
  16. ????char??src?[]?=?"111?<title>Hello?World</title>?222";???//?要被用來匹配的字符串??
  17. ????char??pattern?[]?=?"<title>(.*)</(tit)le>";??????????????//?將要被編譯的字符串形式的正則表達式??
  18. ????printf("String?:?%s/n",?src);??
  19. ????printf("Pattern:?/"%s/"/n",?pattern);??
  20. ????re?=?pcre_compile(pattern,???????//?pattern,?輸入參數,將要被編譯的字符串形式的正則表達式??
  21. ??????????????????????0,????????????//?options,?輸入參數,用來指定編譯時的一些選項??
  22. ??????????????????????&error,???????//?errptr,?輸出參數,用來輸出錯誤信息??
  23. ??????????????????????&erroffset,???//?erroffset,?輸出參數,pattern中出錯位置的偏移量??
  24. ??????????????????????NULL);????????//?tableptr,?輸入參數,用來指定字符表,一般情況用NULL??
  25. ????//?返回值:被編譯好的正則表達式的pcre內部表示結構??
  26. ????if?(re?==?NULL)?{?????????????????//如果編譯失敗,返回錯誤信息??
  27. ????????printf("PCRE?compilation?failed?at?offset?%d:?%s/n",?erroffset,?error);??
  28. ????????return?1;??
  29. ????}??
  30. ????rc?=?pcre_exec(re,????????????//?code,?輸入參數,用pcre_compile編譯好的正則表達結構的指針??
  31. ???????????????????NULL,??????????//?extra,?輸入參數,用來向pcre_exec傳一些額外的數據信息的結構的指針??
  32. ???????????????????src,???????????//?subject,?輸入參數,要被用來匹配的字符串??
  33. ???????????????????strlen(src),??//?length,?輸入參數,?要被用來匹配的字符串的指針??
  34. ???????????????????0,?????????????//?startoffset,?輸入參數,用來指定subject從什么位置開始被匹配的偏移量??
  35. ???????????????????0,?????????????//?options,?輸入參數,?用來指定匹配過程中的一些選項??
  36. ???????????????????ovector,???????//?ovector,?輸出參數,用來返回匹配位置偏移量的數組??
  37. ???????????????????OVECCOUNT);????//?ovecsize,?輸入參數,?用來返回匹配位置偏移量的數組的最大大小??
  38. ????//?返回值:匹配成功返回非負數,沒有匹配返回負數??
  39. ????if?(rc?<?0)?{?????????????????????//如果沒有匹配,返回錯誤信息??
  40. ????????if?(rc?==?PCRE_ERROR_NOMATCH)?printf("Sorry,?no?match?.../n");??
  41. ????????else?printf("Matching?error?%d/n",?rc);??
  42. ????????pcre_free(re);??
  43. ????????return?1;??
  44. ????}??
  45. ????printf("/nOK,?has?matched?.../n/n");???//沒有出錯,已經匹配??
  46. ????for?(i?=?0;?i?<?rc;?i++)?{?????????????//分別取出捕獲分組?$0整個正則公式?$1第一個()??
  47. ????????char?*substring_start?=?src?+?ovector[2*i];??
  48. ????????int?substring_length?=?ovector[2*i+1]?-?ovector[2*i];??
  49. ????????printf("$%2d:?%.*s/n",?i,?substring_length,?substring_start);??
  50. ????}??
  51. ????pcre_free(re);?????????????????????//?編譯正則表達式re?釋放內存??
  52. ????return?0;??
  53. }??

程序來自網上,看到有人不理解最后一個for循環的含義,ovector返回的是匹配字符串的偏移,包括起始偏移和結束偏移,所以就有循環內部的2*i處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統編程---11(會話,守護進程,創建守護進程)

會話 創建會話 創建一個會話需要注意以下6點注意事項 調用進程不能是進程組組長&#xff0c;該進程變成新會話首進程該進程成為一個新進程組的組長進程需要root權限&#xff08;nbuntu不需要&#xff09;新會話丟棄原有的控制終端&#xff0c;該會話沒有控制終端該調用進程是…

判斷一段文件是UTF-8編碼還是GB2312的編碼方式

分類&#xff1a; 算法 cpp2012-03-10 16:01 7120人閱讀 評論(2) 收藏 舉報null生活c對于只包含中文和英文的文本中判斷編碼方式是非常簡單的&#xff0c;中文的編碼方式最常用的是GBK&#xff0c;字符集更大的如GBK向下兼容GB2312&#xff0c;其中包含的的很多一部分字符是我們…

判斷文件的編碼方式

/*功能&#xff1a;實現文件編碼格式的判斷通過一個文件的最前面三個字節&#xff0c;可以判斷出該的編碼類型&#xff1a;ANSI&#xff1a;        無格式定義&#xff1b;(第一個字節開始就是文件內容)Unicode&#xff1a;       前兩個字節為FFFE&#xff1b;…

Linux系統編程----12(線程概念,Linux線程實現原理,棧中ebp指針和ebp指針,線程的優缺點和共享資源)

線程概念 什么是線程 在一個程序里的一個執行路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“一個進程內部的控制序列” 一切進程至少都有一個執行線程線程在進程內部運行&#xff0c;本質是在進程地址空間內運行在Linux系統中&#xff0…

Linux系統編程---13(線程控制函數,創建線程,循環創建多個線程,線程間共享全局變量)

線程控制 操作系統并沒有提供創建線程的系統調用接口&#xff0c;因此大佬們封裝了一個線程的接口庫實現線程控制。意為著用戶創建線程都使用的是庫函數&#xff08;所以有時候我們說創建的線程是一個用戶態線程&#xff0c;但是在內核中對應有一個輕量級進程實現線程程序的調…

Linux系統編程---14(回收子線程,回收多個子線程,線程分離,殺死線程)

回收子線程 pthread_join 函數 阻塞等待線程退出&#xff0c;獲取線程退出狀態 其作用&#xff0c;對應進程中 waitpid() 函數。 int pthread_join (pthread_t thread,void** retval); 成功&#xff1a;0&#xff0c;失敗&#xff1a;錯誤號 參數&#xff1a;thread&#x…

Linux系統編程----15(線程與進程函數之間的對比,線程屬性及其函數,線程屬性控制流程,線程使用注意事項,線程庫)

對比 進程 線程 fork pthread_create exit (10) pthread_exit &#xff08;void *&#xff09; wait (int *) pthread_join &#xff08;&#xff0c;void **&#xff09;阻塞 kill pthread_cancel ();必須到取消點&#xff08;檢查點&#xff09;&#xff1a;…

內核雙向循環鏈表

#include <string.h>#include <stdio.h>#include <stdlib.h>#include<malloc.h>#include <arpa/inet.h>//鏈表頭結構struct list_head{struct list_head *next,*prev;};//真正實現鏈表插入操作void _list_add(struct list_head *nnew,struct lis…

Linux系統編程----16(線程同步,互斥量 mutex,互斥鎖的相關函數,死鎖,讀寫鎖)

同步概念 所謂同步&#xff0c;即同時起步&#xff0c;協調一致。不同的對象&#xff0c;對“同步”的理解方式略有不同。如&#xff0c;設備同步&#xff0c;是指在兩 個設備之間規定一個共同的時間參考&#xff1b;數據庫同步&#xff0c;是指讓兩個或多個數據庫內容保持一致…

轉移字符的轉換

使得網頁上不會顯示 \x0a\x0a \x0a \x0a \x0a \x0a 類似的字符static int te_escape_isDec(char *ptr, unsigned int len) { …

Linux系統編程---17(條件變量及其函數,生產者消費者條件變量模型,生產者與消費者模型(線程安全隊列),條件變量優點,信號量及其主要函數,信號量與條件變量的區別,)

條件變量 條件變量本身不是鎖&#xff01;但它也可以造成線程阻塞。通常與互斥鎖配合使用。給多線程提供一個會合的場所。 主要應用函數&#xff1a; pthread_cond_init 函數pthread_cond_destroy 函數pthread_cond_wait 函數pthread_cond_timedwait 函數pthread_cond_signa…

好友

http://blog.csdn.net/liangyuannao/article/details/8583139

Linux系統編程---18(線程池相關概念及其實現)

線程池 概念&#xff1a; 一堆線程任務隊列 作用 避免大量線程頻繁的創建/銷毀時間成本避免瞬間大量線程創建耗盡資源&#xff0c;程序崩潰危險 實現 創建固定數量的線程創建一個線程安全的任務隊列 一種線程使用模式。 線程過多會帶來調度開銷&#xff0c;進而影響緩…

設計模式--1(設計模式基礎,設計模式基本原則,設計模式分類)

設計模式基礎 模式 在一定環境中解決某一問題的方案&#xff0c;包括三個基本元素–問題&#xff0c;解決方案和環境。大白話&#xff1a;在一定環境下&#xff0c;用固定套路解決問題。 設計模式 是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使…

source insight 使用技巧

source insight 使用技巧 1 sourceinsight screen font 的默認字體是Verdana的&#xff0c;它是一直變寬字體。在Document style中可以將字體改為定寬的Courier2 document options->auto indent 去掉indent Open Brace和Indent Close Brace的效果: 繼上一段&#xff0c;在…

設計模式----2(簡單工廠模式的概念,簡單工廠模式的實現,簡單工廠模式的優缺點)

簡單工廠模式 簡單工廠模式的概念 簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負 責創建其他類的實例&#xff0c;被創建的實例通常都具有共同的父類。 具體分類 工廠&#xff08;Creator&#xff09;角色 簡單工廠模式的核心&#xff0…

Redis常見問題及其一些重點知識總結

1、什么是 Redis&#xff1f;簡述它的優缺點&#xff1f; Redis 的全稱是&#xff1a;Remote Dictionary.Server&#xff0c;本質上是一個 Key-Value 類型的內存數據庫&#xff0c;很像 memcached&#xff0c;整個數據庫統統加載在內存當中進行操作&#xff0c;定期通過異步操…

shell生成隨機文件名

1 #!/bin/bash 2 # tempfile-name.sh: 臨時文件名產生器 3 4 BASE_STRmcookie # 32-字符的 magic cookie. 5 POS11 # 字符串中隨便的一個位置. 6 LEN5 # 取得 $LEN 長度連續的字符串. 7 8 prefixtemp # 最終的一個臨時文…

設計模式---3(工廠方法模式的概念,工廠方法模式的實現,工廠方法模式和簡單工廠模式比較)

工廠方法模式 概念 工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。 工廠方法模式的意義 定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建&#xff0c;這樣核心類成為一個抽象工廠角色&#xff0c;僅…

設計模式---4(抽象工廠模式的概念,產品組和產品等級的概念,抽象工廠模式的實現)

抽象工廠模式 抽象工廠模式的概念 抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口&#xff0c;使得客戶端在不必指定產品的具體類型的情況下&#xff0c;能夠創建多個產品 族的產品對象。 抽象工廠的角色及其職責 抽象工…