PCR使用,普通pcr程序

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: