PCR使用,普通pcr程序
昨天简单介绍了一下pcrecpp的用途。常用的匹配函数有FullMatch、PartilaMatch等。FullMatch和PartilaMatch对采集参数的数量都有限制,最多可以传输16个采集参数。此外,捕获参数不能根据模式中的捕获情况动态设置。我查了一下pcrecpp的一个文档,里面提到DoMatch函数可以做更通用的匹配操作。但对DoMatch功能的介绍仅限于此,谷歌搜索也没有找到更多的资料。
因为要用,所以要看pcrecpp的源码,最后搞定了。我写了一个程序,可以根据传入的模式和匹配的字符串进行动态匹配。在编码的过程中,我们对DoMatch函数有了一些深入的了解,发现DoMatch函数主要是通过调用DoMatchImpl函数来实现的。实际上,FullMatch、PartilaMatch等匹配函数大多是通过调用DoMatchImpl实现的,DoMatchImpl是私有函数,不能直接使用。
下面介绍一下DoMatch函数的用法。该函数的原型是:
bool pre CPP:RE:do match(const string piece text,Anchor anchor,int * consumed,const Arg *const * args,int n);
每个参数的含义如下:
1.const string piece text:string piece是pcrecpp中定义的类型,暂时理解为字符串就够了。
2.Anchor anchor:意思是锚点、未锚定、anchor _ start、anchor _ both。具体意思你自己去理解。在pcrecpp的实现中,FullMatch设置的选项是ANCHOR_BOTH,PartilaMatch设置的选项是AUNANCHORED。
3.int *消耗的:匹配消耗目标字符串中的字符数
4.const Arg *const * args:这个参数的类型可以作为考题来考察对const定义的理解,呵呵。我的理解是,Args是一个指针,它指向一个常量,而常量又是一个指向常量arg类型的指针。其实函数需要的是一个数组,数组中的元素是指向常量Arg类型的const指针。
N: 5.int:这是要捕获的子字符串的数量,等于args数组的大小。
好了,下面我来介绍一下我的小程序。
#定义PCRE_STATIC //静态库编译选项
#包含stdio.h
#包含字符串. h
#包含pcre.h
# define ov account 30/*应该是3的倍数*/
#定义EBUFLEN 128
#定义缓冲区1024
int main()
pcre * re
const char *错误;
int erroffset
int ovector[ove account];
int rc,I;
char src[]= 111 title Hello World/title 222 ;//用于匹配的字符串
Charpattern []= title(。*)/(tit)le//要编译的字符串形式的正则表达式
printf(String : %s/n ,src);
printf(Pattern: /%s//n ,Pattern);
Re=pcre _ compile (pattern,//pattern,输入参数,要编译的字符串形式的正则表达式
0,//options,输入参数在编译时指定一些选项。
Error,//errptr,输出参数,用于输出错误信息。
Erroffset,//erroffset,输出参数,模式中错误位置的偏移量
NULL);//tableptr,输入参数,用于指定字符表。一般使用NULL。
//返回值:编译后正则表达式的pcre内部表示结构
If (re==NULL) {//如果编译失败,将返回一条错误消息
printf(PCRE编译在偏移量%d处失败:%s/n ,erroffset,error);
返回1;
Rc=pcre_exec(re,//code,输入参数,用pcre_compile编译的正则表达式结构的指针
NULL,//extra,输入参数,指向用于向pcre_exec传递一些附加数据信息的结构的指针
Src,//subject,输入参数,用于匹配的字符串
Sren (src),//length,输入参数,用于匹配的字符串的指针
0,//startoffset,输入参数,用于指定匹配主题的偏移量。
0,//options,输入参数指定匹配过程中的一些选项。
Ovector,//ovector,输出参数,用于返回匹配位置偏移量的数组。
ov account);//ovecsize,输入参数,用于返回与位置偏移量匹配的数组的最大大小。
//返回值:匹配成功返回非负数,不匹配返回负数。
If (rc 0) {//如果没有匹配,则返回一条错误消息
if(RC==PCRE _ ERROR _ no match)printf(对不起,没有匹配./n’);
else printf(匹配错误%d/n ,RC);
pcre _ free(re);
返回1;
printf(/nOK,已匹配./n/n’);//没有出错,已经匹配
for(I=0;i i ) { //分别取出捕获分组$0整个正则公式$1第一个()
char * substring _ start=src ovector[2 * I];
int substring _ length=ov ector[2 * I 1]-ov ector[2 * I];
printf($-: % .*s/n ,I,substring_length,substring _ start);
pcre _ free(re);//编译正则表达式是释放内存
返回0;
}
#包括输入输出流
#包含字符串
#包含字符串。h
#包含pcrecpp.h
#包含矢量
使用命名空间标准
//计算线中的匹配括号数,如果括号未完全匹配,则返回-1,否则返回括号对数
(同Internationalorganizations)国际组织括号(字符串pt);
//匹配的结果以线的形式依次存储在相配的中
int match(字符串模式,字符串主题,bool是完全匹配,向量字符串匹配)
pcrecpp:RE _ Options opt;
选择。set _ caseless(true);
尝试{
pcrecpp:RE RE=pcrecpp:RE(pattern,opt);
整数=括号(图案);//根据模式中的括号数目来决定捕获字符串的个数
如果(数字0){
字符串*ss=新字符串[数字];
const pcrecpp:Arg * * args=new const pcrecpp:Arg *[num];//定义参数,注意它的类型哦
for(int I=0;i i ){
args[I]=new pcrecpp:Arg(ss[I]);//需要使用pcrecpp:Arg的构造函数
消耗的int=0;
if(isFullMatch){
关于d match(subject,pcrecpp:RE:ANCHOR_BOTH,consumed,args,num);
}否则{
关于d match(subject,pcrecpp:RE:UNANCHORED,consumed,args,num);
int ret=-1;
如果(回复NumberOfCapturingGroups() 0){
匹配。clear();
for(int I=0;i i ){
匹配。push _ back(ss[I]);
ret=0;//匹配成功,返回值设为0
for(int I=0;i i ){
删除参数[I];
删除[]ss;
删除[]个参数;
返回浸水使柔软
}else if(num==0){
if(isFullMatch){
bool res=re .完全匹配(主题);
return res==true?0 : -1;
}否则{
bool res=re .PartialMatch(主题);
return res==true?0 : -1;
}否则{
cout 括号不成对!恩德尔
return-1;
}catch(exception ex){
发生了一些异常!请检查您的模式;
return-1;
int main()
字符串内容(中国英国剑桥大学
pcrecpp:RE_Options选项;
选项。set _ caseless(true);//不区分大小写
字符串模式=(((中国E B)?(F G)?C A
//可以更改传入的目标串和模式动态决定捕获多少个子串,都以线存起来
匹配的向量字符串;
匹配(模式、内容、真实、匹配);
cout匹配。size()endl;
for(向量字符串:迭代器itr=匹配。begin();itr!=匹配。end();itr)
cout *itr endl
返回0;
还是C比较简洁,看着舒服,C以后要优化下
弄了半天这个东西,希望对大家有帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。