美文网首页
C/C++中的正则表达式库 - PCRE,PCRE++

C/C++中的正则表达式库 - PCRE,PCRE++

作者: MOIC_Qu | 来源:发表于2019-12-06 18:26 被阅读0次

    最近使用boost::regex正则,遇到了延时问题,更换为pcre,延时问题得到解决。这里记录一下pcre的内容。

    PCRE,PCRE++介绍

    PCRE :(Perl Compatible Regular Expressions) (Perl兼容的正则表达式)

    PCRE库是可以与Perl中的正则表达式兼容的正则表达式库。PCRE是免费开源的库,由C语言实现。 官方主页 http://www.pcre.org/

    PCRE++是对于PCREc++封装。提供了便捷的C++接口。 官方主页 http://www.daemon.de/PCRE

    PCRE 接口

    PCRE是一个NFA正则引擎,提供了跟Perl完全一致的正则语法功能,同时也实现了DFA

    1. 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结构,在匹配多个字符串时,可加速匹配。

    1. 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++样例~

    相关文章

      网友评论

          本文标题:C/C++中的正则表达式库 - PCRE,PCRE++

          本文链接:https://www.haomeiwen.com/subject/rfwegctx.html