PCRE函数简介和使用示例【转】

摘要:
PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序示例用法。参数:pattern正则表达式options为0,或者其他参数选项errorcodeptr存放出错码errptr出错消息erroffset出错位置tableptr指向一个字符数组的指针,可以设置为空NULL3.pcre_config原型:#includeintpcre_config;功能:查询当前PCRE版本中使用的选项信息。参数:code成功匹配的模式subject匹配的串ovectorpcre_exec()使用的偏移向量stringcountpcre_exec()的返回值stringname捕获字串的名字buffer用来存储的缓冲区buffersize缓冲区大小示例:Line2730intrc=pcre_copy_named_substring;5.pcre_copy_substring原型:#includeintpcre_copy_substring;功能:根据编号获取捕获的字串。
PCRE函数简介和使用示例

PCRE是一个NFA正则引擎,不然不能提供完全与Perl一致的正则语法功能。但它同时也实现了DFA,只是满足数学意义上的正则。

PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序(pcretest.c)示例用法。

1. pcre_compile

原型:

#include <pcre.h>

pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);

功能:将一个正则表达式编译成一个内部表示,在匹配多个字符串时,可以加速匹配。其同pcre_compile2功能一样只是缺少一个参数errorcodeptr

参数:

pattern正则表达式

options为0,或者其他参数选项

errptr出错消息

erroffset出错位置

tableptr指向一个字符数组的指针,可以设置为空NULL

示例:

L1720re = pcre_compile((char *)p, options, &error, &erroroffset, tables);

2. pcre_compile2

原型:

#include <pcre.h>

pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr);

功能:将一个正则表达式编译成一个内部表示,在匹配多个字符串时,可以加速匹配。其同pcre_compile功能一样只是多一个参数errorcodeptr

参数:

pattern正则表达式

options为0,或者其他参数选项

errorcodeptr存放出错码

errptr出错消息

erroffset出错位置

tableptr指向一个字符数组的指针,可以设置为空NULL

3. pcre_config

原型:

#include <pcre.h>

int pcre_config(int what, void *where);

功能:查询当前PCRE版本中使用的选项信息。

参数:

what选项名

where存储结果的位置

示例:

Line1312(void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);

4. pcre_copy_named_substring

原型:

#include <pcre.h>

int pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int buffersize);

功能:根据名字获取捕获的字串。

参数:

code成功匹配的模式

subject匹配的串

ovectorpcre_exec()使用的偏移向量

stringcountpcre_exec()的返回值

stringname捕获字串的名字

buffer用来存储的缓冲区

buffersize缓冲区大小

示例:

Line2730int rc = pcre_copy_named_substring(re, (char *)bptr, use_offsets,

count, (char *)copynamesptr, copybuffer, sizeof(copybuffer));

5.pcre_copy_substring

原型:

#include <pcre.h>

int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int buffersize);

功能:根据编号获取捕获的字串。

参数:

code成功匹配的模式

subject匹配的串

ovectorpcre_exec()使用的偏移向量

stringcountpcre_exec()的返回值

stringnumber捕获字串编号

buffer用来存储的缓冲区

buffersize缓冲区大小

示例:

Line2730 int rc = pcre_copy_substring((char *)bptr, use_offsets, count,

i, copybuffer, sizeof(copybuffer));

6.pcre_dfa_exec

原型:

#include <pcre.h>

int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize, int *workspace, int wscount);

功能:使用编译好的模式进行匹配,采用的是一种非传统的方法DFA,只是对匹配串扫描一次(与Perl不兼容)。

参数:

code编译好的模式

extra指向一个pcre_extra结构体,可以为NULL

subject需要匹配的字符串

length匹配的字符串长度(Byte)

startoffset匹配的开始位置

options选项位

ovector指向一个结果的整型数组

ovecsize数组大小

workspace一个工作区数组

wscount数组大小

示例:

Line2730count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset,

options | g_notempty, use_offsets, use_size_offsets, workspace,

sizeof(workspace)/sizeof(int));

7.pcre_copy_substring

原型:

#include <pcre.h>

int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize);

功能:使用编译好的模式进行匹配,采用与Perl相似的算法,返回匹配串的偏移位置。。

参数:

code编译好的模式

extra指向一个pcre_extra结构体,可以为NULL

subject需要匹配的字符串

length匹配的字符串长度(Byte)

startoffset匹配的开始位置

options选项位

ovector指向一个结果的整型数组

ovecsize数组大小

8.pcre_free_substring

原型:

#include <pcre.h>

void pcre_free_substring(const char *stringptr);

功能:释放pcre_get_substring()和pcre_get_named_substring()申请的内存空间。

参数:

stringptr指向字符串的指针

示例:

Line2730const char *substring;

int rc = pcre_get_substring((char *)bptr, use_offsets, count,

i, &substring);

……

pcre_free_substring(substring);

9.pcre_free_substring_list

原型:

#include <pcre.h>

void pcre_free_substring_list(const char **stringptr);

功能:释放由pcre_get_substring_list申请的内存空间。

参数:

stringptr指向字符串数组的指针

示例:

Line2773const char **stringlist;

int rc = pcre_get_substring_list((char *)bptr, use_offsets, count,

……

pcre_free_substring_list(stringlist);

10.pcre_fullinfo

原型:

#include <pcre.h>

int pcre_fullinfo(const pcre *code, const pcre_extra *extra, int what, void *where);

功能:返回编译出来的模式的信息。

参数:

code编译好的模式

extrapcre_study()的返回值,或者NULL

what什么信息

where存储位置

示例:

Line997if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0)

fprintf(outfile, "Error %d from pcre_fullinfo(%d)/n", rc, option);

}

11.pcre_get_named_substring

原型:

#include <pcre.h>

int pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, const char **stringptr);

功能:根据编号获取捕获的字串。

参数:

code成功匹配的模式

subject匹配的串

ovectorpcre_exec()使用的偏移向量

stringcountpcre_exec()的返回值

stringname捕获字串的名字

stringptr存放结果的字符串指针

示例:

Line2759const char *substring;

int rc = pcre_get_named_substring(re, (char *)bptr, use_offsets,

count, (char *)getnamesptr, &substring);

12.pcre_get_stringnumber

原型:

#include <pcre.h>

int pcre_get_stringnumber(const pcre *code, const char *name);

功能:根据命名捕获的名字获取对应的编号。

参数:

code成功匹配的模式

name捕获名字

13.pcre_get_substring

原型:

#include <pcre.h>

int pcre_get_substring(const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr);

功能:获取匹配的子串。

参数:

subject成功匹配的串

ovectorpcre_exec()使用的偏移向量

stringcountpcre_exec()的返回值

stringnumber获取的字符串编号

stringptr字符串指针

14.pcre_get_substring_list

原型:

#include <pcre.h>

int pcre_get_substring_list(const char *subject, int *ovector, int stringcount, const char ***listptr);

功能:获取匹配的所有子串。

参数:

subject成功匹配的串

ovectorpcre_exec()使用的偏移向量

stringcountpcre_exec()的返回值

listptr字符串列表的指针

15.pcre_info

原型:

#include <pcre.h>

int pcre_info(const pcre *code, int *optptr, int *firstcharptr);

已过时,使用pcre_fullinfo替代。

16.pcre_maketables

原型:

#include <pcre.h>

const unsigned char *pcre_maketables(void);

功能:生成一个字符表,表中每一个元素的值不大于256,可以用它传给pcre_compile()替换掉内建的字符表。

参数:

示例:

Line2759tables = pcre_maketables();

17.pcre_refcount

原型:

#include <pcre.h>

int pcre_refcount(pcre *code, int adjust);

功能:编译模式的引用计数。

参数:

code已编译的模式

adjust调整的引用计数值

18.pcre_study

原型:

#include <pcre.h>

pcre_extra *pcre_study(const pcre *code, int options, const char **errptr);

功能:对编译的模式进行学习,提取可以加速匹配过程的信息。

参数:

code已编译的模式

options选项

errptr出错消息

示例:

Line1797extra = pcre_study(re, study_options, &error);

19.pcre_version

原型:

#include <pcre.h>

char *pcre_version(void);

功能:返回PCRE的版本信息。

参数:

示例:

Line1384if (!quiet) fprintf(outfile, "PCRE version %s/n/n", pcre_version());

程序实例:

1 #define PCRE_STATIC //静态库编译选项
2 #include <stdio.h>
3 #include <string.h>
4 #include <pcre.h>
5 #define OVECCOUNT 30 /* should be a multiple of 3 */
6 #define EBUFLEN 128
7 #define BUFLEN 1024
8 
9 intmain()
10 {
11     pcre  *re;
12     const char *error;
13     interroffset;
14     intovector[OVECCOUNT];
15     intrc, i;
16     char  src [] = "111 <title>Hello World</title> 222";   //要被用来匹配的字符串
17     char  pattern [] = "<title>(.*)</(tit)le>";              //将要被编译的字符串形式的正则表达式
18     printf("String : %s/n", src);
19     printf("Pattern: /"%s/"/n", pattern);
20     re = pcre_compile(pattern,       //pattern, 输入参数,将要被编译的字符串形式的正则表达式
21                       0,            //options, 输入参数,用来指定编译时的一些选项
22                       &error,       //errptr, 输出参数,用来输出错误信息
23                       &erroffset,   //erroffset, 输出参数,pattern中出错位置的偏移量
24                       NULL);        //tableptr, 输入参数,用来指定字符表,一般情况用NULL
25     //返回值:被编译好的正则表达式的pcre内部表示结构
26     if (re == NULL) {                 //如果编译失败,返回错误信息
27         printf("PCRE compilation failed at offset %d: %s/n", erroffset, error);
28         return 1;
29 }
30     rc = pcre_exec(re,            //code, 输入参数,用pcre_compile编译好的正则表达结构的指针
31                    NULL,          //extra, 输入参数,用来向pcre_exec传一些额外的数据信息的结构的指针
32                    src,           //subject, 输入参数,要被用来匹配的字符串
33                    strlen(src),  //length, 输入参数, 要被用来匹配的字符串的指针
34                    0,             //startoffset, 输入参数,用来指定subject从什么位置开始被匹配的偏移量
35                    0,             //options, 输入参数, 用来指定匹配过程中的一些选项
36                    ovector,       //ovector, 输出参数,用来返回匹配位置偏移量的数组
37                    OVECCOUNT);    //ovecsize, 输入参数, 用来返回匹配位置偏移量的数组的最大大小
38     //返回值:匹配成功返回非负数,没有匹配返回负数
39     if (rc < 0) {                     //如果没有匹配,返回错误信息
40         if (rc == PCRE_ERROR_NOMATCH) printf("Sorry, no match .../n");
41         else printf("Matching error %d/n", rc);
42 pcre_free(re);
43         return 1;
44 }
45     printf("/nOK, has matched .../n/n");   //没有出错,已经匹配
46     for (i = 0; i < rc; i++) {             //分别取出捕获分组 $0整个正则公式 $1第一个()
47         char *substring_start = src + ovector[2*i];
48         int substring_length = ovector[2*i+1] - ovector[2*i];
49         printf("$%2d: %.*s/n", i, substring_length, substring_start);
50 }
51     pcre_free(re);                     //编译正则表达式re 释放内存
52     return 0;
53 }

程序来自网上,看到有人不理解最后一个for循环的含义,ovector返回的是匹配字符串的偏移,包括起始偏移和结束偏移,所以就有循环内部的2*i处理。

免责声明:文章转载自《PCRE函数简介和使用示例【转】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBlade 模糊查询如何高效开展测试用例评审?附用例评审检查清单及用例评审报告模板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

char和uchar区别

char 是有符号的, uchar(unsigned char)是无符号的! 1、作为字符来表示的话,两者没有什么区别! 2、作为整数来表示的话,由于char是有符号的,于是数值范围为-128~127     而uchar是无符号的,于是数值范围为0~255,在图像处理中表示像素值范围时用的多!...

Freemarker 基本数据类型

一 数据类型简介 freemarker 模板中的数据类型由如下几种: 1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出 2. 日期型:等价于java中的Date类型, 不同之处在于不能直接输出,需要转换成字符串再输出 3. 数值型:等价于java 中的int, float, double 等数值类型,有三...

使用Tensorflow对模型进行量化

本文旨在将迁移学习训练好的模型基于tensorflow工具进行量化。 环境配置及迁移学习部分可参考博文[https://www.cnblogs.com/hayley111/p/12887853.html]。 首先使用如下workflow理解模型部署的过程,本文主要描述的是quant这一步。 1. 环境准备: 安装bazel bazel是一个开源的构造和测...

Perl模式匹配

       Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织里用于在你的 web 站点上生成一些动态信息,Perl 都是你可选的工具。这里的一部分原因是 Perl 的数据库联接能力,但是更重要的原因是...

HAProxy基础

一、简介 HAProxy是由C语言编写基于事件驱动模型的一款高效稳定、功能强大的负载均衡软件,其性能可媲美商业负载均衡软件,不过在最新的版本中HAProxy已经分为社区版本和企业版,社区版完全免费,企业版有丰富的额外功能。 优缺点: 优点 支持虚拟主机的,通过frontend指令来实现 能弥补Nginx的一些缺点比如Session的保持,Cookie的引...

【算法】滑动窗口三步走

滑动窗口介绍 对于大部分滑动窗口类型的题目,一般是考察字符串的匹配。比较标准的题目,会给出一个模式串B,以及一个目标串A。然后提出问题,找到A中符合对B一些限定规则的子串或者对A一些限定规则的结果,最终再将搜索出的子串完成题意中要求的组合或者其他。 比如:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起...