首页 > 程序人生 > 深入浅出C/C++中的正则表达式库(三)——PCRE, PCRE++

深入浅出C/C++中的正则表达式库(三)——PCRE, PCRE++

写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第三篇,本文的主要内容是介绍PCRE和PCRE++,因为它们两个是很有渊源的,所以放在一起讲。

1. 什么是PCRE? 什么是PCRE++?
PCRE,全称是Perl Compatible Regular Expressions。从名字我们可以看出PCRE库是与Perl中正则表达式相兼容的一个正则表达式库。PCRE是免费开源的库,它是由C语言实现的,这里是它的官方主页:http://www.pcre.org/,感兴趣的朋友可以在这里了解更多的内容。
要得到PCRE库,可以从这里下载:http://sourceforge.net/projects/pcre/files/

PCRE++是一个对PCRE库的C++封装,它提供了更加方便、易用的C++接口。这里是它的官方主页:http://www.daemon.de/PCRE,感兴趣的朋友可以在这里了解更多的内容。
要得到PCRE++库,可以从这里下载:http://www.daemon.de/PcreDownload

2. PCRE接口介绍
(1). pcre_compile

1
2
3
4
5
6
7
8
9
10
pcre *pcre_compile(const char *pattern, int options,
            const char **errptr, int *erroffset,
            const unsigned char *tableptr);
功能:编译指定的正则表达式
参数:pattern, 输入参数,将要被编译的字符串形式的正则表达式
      options, 输入参数,用来指定编译时的一些选项
      errptr, 输出参数,用来输出错误信息
      erroffset, 输出参数,pattern中出错位置的偏移量
      tableptr, 输入参数,用来指定字符表,一般情况用NULL, 使用缺省的字符表
返回值:被编译好的正则表达式的pcre内部表示结构

(2). pcre_exec

1
2
3
4
5
6
7
8
9
10
11
12
13
int pcre_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize);
功能:用来检查某个字符串是否与指定的正则表达式匹配
参数: code, 输入参数,用pcre_compile编译好的正则表达结构的指针
      extra, 输入参数,用来向pcre_exec传一些额外的数据信息的结构的指针
      subject, 输入参数,要被用来匹配的字符串
      length, 输入参数, 要被用来匹配的字符串的指针
      startoffset, 输入参数,用来指定subject从什么位置开始被匹配的偏移量
      options, 输入参数, 用来指定匹配过程中的一些选项
      ovector, 输出参数,用来返回匹配位置偏移量的数组
      ovecsize, 输入参数, 用来返回匹配位置偏移量的数组的最大大小
返回值:匹配成功返回非负数,匹配返回负数

3. PCRE++接口介绍
PCRE++把PCRE库封装成了两个类,一个是RE_Options, 用来指定匹配选项,一个是RE,用来提供匹配相关的接口。RE_options类在这里我就不介绍了,我主要介绍一下RE类:
(1)RE的构造函数传入正则表达式,并在构造函数中调用Init函数,将该正则表达进行编译
(2)RE的pattern()成员用来得到初始传入的正则表达式字符串
(3)RE的error()成员用来得到匹配过程中的出错信息
(4)RE的FullMatch()成员用来判断某字符串整体是否匹配指定正则表达式
(5)RE的PartialMatch()成员用来判断某字符串的部分是否匹配指定正则表达式

4. PCRE/PCRE++使用注意事项
(1)使用pcre请包含pcre.h头文件
(2)使用pcre_compile, pcre_exec后,记得调用pcre_free释放内存,以免造成内存泄露
(3)使用pcre编译的时候需要依赖libpcre.a
(4)使用pcre++请包含pcrecpp.h头文件
(5)使用pcre++,RE类的析构函数会自动释放相关内存,因此不用担心内存泄露
(6)使用pcre++编译的时候需要依赖libpcrecpp.a
(7)使用pcrecpp要使用pcrecpp命名空间

5. PCRE使用举例
下面是例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <pcre .h>
#include <stdio .h>
#include <string .h>
 
int main(int argc, char ** argv)
{
    if (argc != 3)
    {   
        printf("Usage: %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
    {   
        if (pcre_exec(pPcre, NULL, pText, strlen(pText), 0, 0, NULL, 0) < 0)
        {   
            printf("%s doesn't match %s\n", pText, pPattern);
        }   
        else
        {   
            printf("%s matches %s\n", pText, pPattern);
        }
    }
}

下面是运行结果:

1
2
3
4
5
6
wuzesheng@wuzesheng-ubuntu:~/Program$ !g++
g++ -lpcre TestPcre.cpp -o pcre
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcre "http:\/\/.*\.qq\.com" "http://www.qq.com"
http://www.qq.com matches http:\/\/.*\.qq\.com
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcre "http:\/\/.*\.qq\.com" "http://www.qqq.com"
http://www.qqq.com doesn't match http:\/\/.*\.qq\.com

6. PCRE++使用举例
下面是例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <pcrecpp .h>
 
int main(int argc, char ** argv)
{
    if (argc != 3)
    {   
        std::cerr < < "Usage: " << argv[0] << " pattern text\n";
        return 1;
    }   
 
    pcrecpp::RE oPattern(argv[1]);
    if (oPattern.FullMatch(argv[2]))
    {   
        std::cout << argv[2] << " fully matches " << argv[1] << "\n";
    }   
    else if (oPattern.PartialMatch(argv[2]))
    {   
        std::cout << argv[2] << " partially matches " << argv[1] << "\n";
    }   
    else
    {   
        std::cout << argv[2] << " dose not match " << argv[1] << "\n";
    }   
}

下面是运行结果:

1
2
3
4
5
6
7
8
9
wuzesheng@wuzesheng-ubuntu:~/Program$ g++ TestPcreCpp.cpp -lpcrecpp -o pcrecpp
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcrecpp 
Usage: ./pcrecpp pattern text
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.com"
http://www.qq.com fully matches http:\/\/.*\.qq\.com
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.comiii"
http://www.qq.comiii partially matches http:\/\/.*\.qq\.com
wuzesheng@wuzesheng-ubuntu:~/Program$ ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qqq.comiii"
http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com

以上即是关于PCRE和PCRE++库介绍的全部内容,由于内容比较多,我只介绍了一些关键的接口及其用法,如果读者朋友想更加深入的了解其它的接口,可以参考我上面提到的官方网站,另外linux下的manual也是很好的参考资料。在shell下执行man pcre和man pcrecpp便可得到很详细的资料。

  1. deltali
    2013年2月5日15:46 | #1

    小武哥,文中所用的“PCRE++示例” 中的接口是pcrecpp.h中定义的,封装为pcrecpp::RE 及 pcrecpp::RE_Options,应该为pcre提供的c++接口,PCRE++封装的c++接口直接叫:class Pcre

  2. Cyan
    2013年5月8日17:19 | #2

    “5PCRE使用举例”中没有调用 pcre_free 的嘛

  3. sd886393
    2014年6月10日18:49 | #3

    对哇 为什么没有用pcre_free释放pcre申请的指针呢?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.

Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in /home/wuzeshengpwmuqzeeas7h4eknug/wwwroot/wp-content/plugins/quickstats/quickstats.php on line 345

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/wuzeshengpwmuqzeeas7h4eknug/wwwroot/wp-content/plugins/quickstats/quickstats.php on line 345

Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in /home/wuzeshengpwmuqzeeas7h4eknug/wwwroot/wp-content/plugins/quickstats/quickstats.php on line 346

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/wuzeshengpwmuqzeeas7h4eknug/wwwroot/wp-content/plugins/quickstats/quickstats.php on line 346

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/wuzeshengpwmuqzeeas7h4eknug/wwwroot/wp-content/plugins/quickstats/quickstats.php on line 346