C/C++中的正则表达式库 - PCRE,PCRE++
2019-12-06 本文已影响0人
MOIC_Qu
最近使用
boost::regex
正则,遇到了延时问题,更换为pcre
,延时问题得到解决。这里记录一下pcre
的内容。
PCRE,PCRE++介绍
PCRE
:(Perl Compatible Regular Expressions
) (Perl兼容的正则表达式)
PCRE
库是可以与Perl中的正则表达式兼容的正则表达式库。PCRE
是免费开源的库,由C语言实现。 官方主页 http://www.pcre.org/
PCRE++
是对于PCRE
的c++
封装。提供了便捷的C++
接口。 官方主页 http://www.daemon.de/PCRE
PCRE 接口
PCRE是一个NFA正则引擎,提供了跟Perl完全一致的正则语法功能,同时也实现了DFA
- pcre_compile
pcre *pcre_complie(const char *pattern,
int options,
const char **errptr,
int *erroffset,
const unsigned char *tableptr
);
//编译指定的正则表达式
//参数:
pattern : 正则表达式
options : 0 或其它参数选项
errptr : 返回出错信息
erroffset : 返回出错位置
tableptr : 指向一个字符数组的指针,可设置为 NULL
功能:将一个正则表达式编译成一个内部的pcre结构,在匹配多个字符串时,可加速匹配。
- 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_extra结构体 可为NULL
subject : 需要匹配的字符串
length : 待匹配字符串的长度 (byte)
startoffset : 匹配的开始位置
options : 选项位
ovector : 指向一个结果的整型数组
ovecsize : 数组大小 (应为3的整数倍)
功能:使用编译好的模式进行匹配,采用与Perl相似的算法。返回值大于零,为匹配到的个数,反之表示出错信息。
PCRE使用例子
#include <pcre.h>
#include <stdio.h>
#include <string.h>
#define OVECCOUNT 30
int main(int argc, char ** argv)
{
int ovector[OVECCOUNT];
if (argc != 3)
{
printf(" %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
{
int rc;
rc = pcre_exec(pPcre, NULL, pText, strlen(pText), 0, 0, ovector, OVECCOUNT);
if ( rc < 0)
{
printf("%s doesn't match %s\n", pText, pPattern);
}
else
{
for(int i = 0; i < rc; ++i) {
printf("\n%d\n",i);
const char *str = pText + ovector[2*i];
int str_len = ovector[2*i+1] - ovector[2*i];
printf("%.*s\n", str_len, str);
}
printf("%s matches %s\n", pText, pPattern);
}
printf("Rc : %d\n", rc);
}
编译 testpcre.cpp
g++ testpcre.cpp -lpcrecpp
./a.out "http://(\w+)\.qq\.com/([\s\S]*)" "http://cccc.qq.com/abababa/kkk/a"
0
http://cccc.qq.com/abababa/kkk/a
1
cccc
2
abababa/kkk/a
http://cccc.qq.com/abababa/kkk/a matches http://(\w+)\.qq\.com/([\s\S]*)
RC: 3</pre>
TODO
PCRE++样例~