PCRE接口pcre_fullinfo混合子模式调用结果
NGINX中使用PCRE最為正則表達(dá)式的解析接口,對(duì)編譯和解析過程中的一些點(diǎn)進(jìn)行了測(cè)試驗(yàn)證
PCRE接口pcre_fullinfo()的描述在這個(gè)鏈接中有詳細(xì)的描述,這里對(duì)接口的一些
鏈接?http://mushclient.com/pcre/index.html
這里描述一下命名子模式(named subpattern)和非命名子模式(numbering subpattern)混合使用的情況接口
PCRE_INFO_CAPTURECOUNT: 得到的是所有子模式的個(gè)數(shù),包含上述的兩種子模式個(gè)數(shù);
PCRE_INFO_NAMECOUNT: 得到的是命名子模式的個(gè)數(shù),不包括非命名子模式的個(gè)數(shù);
PCRE_INFO_NAMETABLE:
對(duì)于只有命名子模式的情況,例如文檔描述的一個(gè)例子:
?(?<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 ??
而對(duì)于混合模式;例子如下,注意開頭的兩個(gè)數(shù)字,就是說capture的數(shù)字是和非命名子模式一起排列的,也就是根據(jù)左括號(hào)的先后排列的:
(eeeee)(?<abb> exception)(?<adfa>xydz)(ddddd)\k<abb>\1\2
{captures 4?
named_captures 2?
name_size 7}
?
0 2 abb???
0 3 adfa?
測(cè)試?yán)?/p> #include <stdlib.h> #include <pcre.h>#define NGX_REGEX_CASELESS ? ?PCRE_CASELESStypedef 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; }
---------------------?
作者:zwleagle?
來源:CSDN?
原文:https://blog.csdn.net/zwleagle/article/details/8563364?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的PCRE接口pcre_fullinfo混合子模式调用结果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx模块开发—HTTP初始化之li
- 下一篇: nginx源码分析(5)——监听sock