0%

# pcre-intro-and-a-simple-package

Posted on 2015-01-16 Edited on 2020-01-12 In C++ Views: Views: Disqus:

### Pcre

> Perl Compatible Regular Expressions (PCRE) is a regular
> expression C library inspired by the regular expression
> capabilities in the Perl programming language, written
> by Philip Hazel, starting in summer 1997.

因为最近工作内容的一部分需要做字符串的识别处理，所以就顺便用上了之前在PHP中用过的正则，在C/C++中本身不包含正则库，这里使用的pcre，对MFC开发，在这里提供了静态链接库，在引入lib跟.h文件后即可使用。

### Regular Expression Syntax

然后是一些正则语法，官方的语法文档比较科学严谨，特别是对类似于贪婪匹配等细节的说明，当然一般的使用可以在网上找到很多匹配语法，例如这个。

### PCRE函数介绍

> pcre_compile
> 原型：

    1
    2

    #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

> pcre_exec
> 原型：

    1
    2

    #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` 数组大小。

这里是两个最常用的函数的简单说明，pcre的静态库提供了一系列的函数以供使用，可以参考这个博客说明，另外对于以上函数的具体参数详细说明可以参考官网此处

### 一个丑陋的封装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    void COcxDemoDlg::pcre_exec_all(const pcre * re, PCRE_SPTR src, vector<pair<int, int>> &vc)
    {
    	int rc;
    	int ovector[30];
    	int i = 0;
    	pair<int, int> pr;
    	rc = pcre_exec(re, NULL, src, strlen(src), i, 0, ovector, 30);
    	for (; rc > 0;)
    	{
    		i = ovector[1];
    		pr.first = ovector[2];
    		pr.second = ovector[3];
    		vc.push_back(pr);
    		rc = pcre_exec(re, NULL, src, strlen(src), i, 0, ovector, 30);
    	}
    }

vector中是全文匹配后的索引对，只是简单地用下。

Related Posts

- MFC 模态对话框
- Path Sum
- leetcode no.3
- 34_Search_for_a_Range
- Number of 1 Bits

请我喝杯咖啡

WeChat Pay

Alipay

- Post author: Nicksxs
- Post link: https://nicksxs.me/2015/01/16/pcre-intro-and-a-simple-package/
- Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.