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
命名空间
5. PCRE
使用举例
下面是例程:
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 |
#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); } } } |
下面是运行结果:
1 2 3 4 5 6 |
$ g++ -lpcre TestPcre.cpp -o pcre $ ./pcre "http:\/\/.*\.qq\.com" "http://www.qq.com" http://www.qq.com matches http:\/\/.*\.qq\.com $ ./pcre "http:\/\/.*\.qq\.com" "http://www.qqq.com" http://www.qqq.com doesn't match http:\/\/.*\.qq\.com |
6. PCRE++
使用举例
下面是例程:
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 |
#include <iostream> #include <pcrecpp.h> int main(int argc, char ** argv) { if (argc != 3) { std::cerr < < "Usage: " << argv[0] << " pattern text\n"; return 1; } pcrecpp::RE oPattern(argv[1]); if (oPattern.FullMatch(argv[2])) { std::cout << argv[2] << " fully matches " << argv[1] << "\n"; } else if (oPattern.PartialMatch(argv[2])) { std::cout << argv[2] << " partially matches " << argv[1] << "\n"; } else { std::cout << argv[2] << " dose not match " << argv[1] << "\n"; } } |
下面是运行结果:
1 2 3 4 5 6 7 8 9 10 |
$ g++ TestPcreCpp.cpp -lpcrecpp -o pcrecpp $ ./pcrecpp Usage: ./pcrecpp pattern text $ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.com" http://www.qq.com fully matches http:\/\/.*\.qq\.com $ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.comiii" http://www.qq.comiii partially matches http:\/\/.*\.qq\.com $ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qqq.comiii" http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com |