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++是对于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++样例~

上一篇下一篇

猜你喜欢

热点阅读