PCRE接口pcre_fullinfo混合子模式调用结果

NGINX中使用PCRE最为正则表达式的解析接口,对编译和解析过程中的一些点进行了测试验证


PCRE接口pcre_fullinfo()的描述在这个链接中有详细的描述,这里对接口的一些

链接 http://mushclient.com/pcre/index.html


这里描述一下命名子模式(named subpattern)和非命名子模式(numbering subpattern)混合使用的情况接口

PCRE_INFO_CAPTURECOUNT: 得到的是所有子模式的个数,包含上述的两种子模式个数;

PCRE_INFO_NAMECOUNT: 得到的是命名子模式的个数,不包括非命名子模式的个数;


PCRE_INFO_NAMETABLE:

对于只有命名子模式的情况,例如文档描述的一个例子:

 (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) )
 00 01 d  a  t  e  00 ??
  00 05 d  a  y  00 ?? ??
  00 04 m  o  n  t  h  00
  00 02 y  e  a  r  00 ??

而对于混合模式;例子如下,注意开头的两个数字,就是说capture的数字是和非命名子模式一起排列的,也就是根据左括号的先后排列的:

(eeeee)(?<abb> exception)(?<adfa>xydz)(ddddd)\k<abb>\1\2

{captures 4 

named_captures 2 
name_size 7}

 
0 2 abb?? 
0 3 adfa 


测试例子

#include <stdlib.h>
#include <pcre.h>

#define NGX_REGEX_CASELESS    PCRE_CASELESS

typedef struct {
    pcre        *code;
    pcre_extra  *extra;
} ngx_regex_t;


int main()
{

    pcre  *re;
    char       *errstr;
    int  erroff;

    int captures =0, named_captures, name_size;
    char  *name;

    char  *data = "(eeeee)(?<abb> exception)(?<adfa>xydz)(ddddd)\\k<abb>\\1\\2";
    int n, i;
    char  *p; 


    printf("%s \n", data);

    p = data;

    printf("%s \n", p);

    re = pcre_compile(data, PCRE_CASELESS, &errstr, &erroff, NULL);

    if(NULL == re)
    {
        printf("compile pcre failed\n");

        return 0;
    }
   
 
    n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &captures);

    if(n < 0)
    {
         printf("pcre_fullinfo PCRE_INFO_CAPTURECOUNT failed %d \n", n);

         return 0;

    }         
    
    printf(" captures %d \n", captures);

    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &named_captures);

    if(n < 0)
    {
         printf("pcre_fullinfo PCRE_INFO_NAMECOUNT failed %d \n", n);

         return 0;

    }

    printf("named_captures %d \n", named_captures);

    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &name_size);

     if(n < 0)
     {
          printf("pcre_fullinfo PCRE_INFO_NAMEENTRYSIZE failed %d \n", n);
 
          return 0;
 
     }


     printf("name_size %d \n", name_size);


     n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &name);
    if(n < 0)
    {
       printf("pcre_fullinfo PCRE_INFO_NAMETABLE failed %d \n", n);
 
      return 0;
  
    }


    p =name;
    int j;
   for(j = 0; j < named_captures; j++)
   {
        for(i = 0; i <2; i++)
        {
        
            printf("%x ", p[i]);      
        }

        
       
       printf("%s \n", &p[2]);
        p += name_size;

    
    }
    return 1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值