一、GNU Regex Library
1. 什麼是GNU正則表達式庫(GNU Regex Library) ?
GNU正則表達式庫是glibc(GNU C Library)的一部分,它提供與POSIX標准兼容的正則表達式匹配的接口。
這裡是其主頁:http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html
下載該庫點這裡:gnuregex0_13
2. GNU Regex Library所提供的接口
(1)regcomp:
1
2
3
4
5
6
int regcomp(regex_t *preg, const char *pattern, int cflags)
功能:將要進行匹配的正則表達式pattern進行編譯,做匹配前的准備工作
參數: preg, 輸出參數,用來保存編譯後的正則表達式結果
pattern, 輸入參數,傳入要進行編譯的正則表達式的字符串
cflags, 輸入參數,用來指定正則表達式匹配過程中的一些選項
返回值:編譯成功返回0,失敗返回非0的錯誤碼
(2)regexec:
1
2
3
4
5
6
7
8
9
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[],
int eflags)
功能:用來檢測字符串string是否匹配正則表達式preg
參數: preg, 輸入參數,在(1)regcomp中編譯好的正則表達式規則
string, 輸入參數,用來被匹配的字符串
nmatch, 輸入參數,用來指定pmatch參數所對應的數組的長度
pmatch, 輸出參數,用來輸出在string中匹配preg的具體位置
eflag, 輸入參數,用來指定正則表達式匹配過程中的一些選項
返回值: 如果string匹配preg所指定的規則,則返回0, 否則返回非0
(3)regerror:
1
2
3
4
5
6
7
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
功能:用來把在regcompt和regexec中產生的錯誤碼轉化成字符串形式的錯誤信息
參數: errcode, 輸入參數,在regcomp或regexec調用中返回的錯誤碼
preg, 輸入參數,與錯誤碼所對應的編譯過的正則表達式結構
errbuf, 輸出參數,用來返回錯誤信息的buffer,如果buffer不夠所需大小,錯誤信息將被截斷
errbuf_size, 輸入參數,返回錯誤信息的buffer的大小
返回值: 如果errbuf_size為0,那麼regerror返回錯誤信息所需要的buffer的大小
(4)regfree:
1
2
3
4
void regfree (regex_t *preg)
功能: 用來釋放由regcomp編譯時生成的preg結構所占用的內存
參數: preg, 輸入參數,由regcomp編譯時生成的正則表達的結構指針
返回值: 無
3. 使用GNU Regex Library的一些注意事項
(1)regcomp與regfree必須配對使用,要不然會造成內存洩漏(類比malloc/free, new/delete)
(2)regex_t結構:把字符串形式的正則表達式編譯成regex_t這樣的一個結構,方便後續的匹配工作
(3)regmatch_t結構:用來表示正則表達式中字符串中匹配的位置的結構,用起始位置的偏移量來表示的
(4)flags:用來配置匹配過程中的一些選項, 指定如何匹配,具體參見:http://www.opengroup.org/onlinepubs/007908799/xsh/regcomp.html
(5)使用該庫需要包含的頭文件:sys/types.h和regex .h
4. GNU Regex Library使用舉例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <sys /types.h>
#include <regex .h>
#include <stdio .h>
int main(int argc, char ** argv)
{
if (argc != 3)
{
printf("Usage: %s RegexString Text\n", argv[0]);
return 1;
}
const char * pRegexStr = argv[1];
const char * pText = argv[2];
regex_t oRegex;
int nErrCode = 0;
char szErrMsg[1024] = {0};
size_t unErrMsgLen = 0;
if ((nErrCode = regcomp(&oRegex, pRegexStr, 0)) == 0)
{
if ((nErrCode = regexec(&oRegex, pText, 0, NULL, 0)) == 0)
{
printf("%s matches %s\n", pText, pRegexStr);
regfree(&oRegex);
return 0;
}
}
unErrMsgLen = regerror(nErrCode, &oRegex, szErrMsg, sizeof(szErrMsg));
unErrMsgLen = unErrMsgLen < sizeof(szErrMsg) ? unErrMsgLen : sizeof(szErrMsg) - 1;
szErrMsg[unErrMsgLen] = '\0';
printf("ErrMsg: %s\n", szErrMsg);
regfree(&oRegex);
return 1;
}
程序測試:
1
2
3
4
5
[email protected]:~/Program$ gcc TestRegex.c -o Regex
[email protected]:~/Program$ ./Regex "http:\/\/www\..*\.com" "https://www.taobao.com"
ErrMsg: No match
[email protected]:~/Program$ ./Regex "http:\/\/www\..*\.com" "http://www.taobao.com"
http://www.taobao.com matches http:\/\/www\..*\.com
二、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
1
2
3
4
5
6
7
8
9
10
pcre *pcre_compile(const char *pattern, int options,
const char **errptr, int *erroffset,
const unsigned char *tableptr);
功能:編譯指定的正則表達式
參數:pattern, 輸入參數,將要被編譯的字符串形式的正則表達式
options, 輸入參數,用來指定編譯時的一些選項
errptr, 輸出參數,用來輸出錯誤信息
erroffset, 輸出參數,pattern中出錯位置的偏移量
tableptr, 輸入參數,用來指定字符表,一般情況用NULL, 使用缺省的字符表
返回值:被編譯好的正則表達式的pcre內部表示結構
(2). pcre_exec
1
2
3
4
5
6
7
8
9
10
11
12
13
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命名空間