深入浅出C/C++中的正则表达式库

 本文摘自:  小武哥的博客
写在前面: 本文是面向有正则表达式基础的读者朋友的,如果你还不知道正则表达式是什么,请先到这里学习一下  ;-)  : http://en.wikipedia.org/wiki/Regular_expression

正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便、灵活的文本处理工具。它可以用来精确地找出某文本中匹配某种指定规则的内容。在linux下,grep, sed, awk等工具都支持正则表达式,这些工具的存在,为我们日常的文本处理带来了极大的便利。但是,有时候,我们自己写的程序中也需要用到正则表达式来处理一些文本,这时候就需要一些正则表达式库的支持了。由于我本人是用C/C++做为主要开发语言的,所以,在本文以及接下来的几篇文章中,我将介绍几个常用的C/C++的正则表达式的库,通过我的介绍,以及对具体的使用进行举例,希望能够给读者朋友在C/C++程序中使用正则表达式时有点帮助,这将是我莫大的荣幸。

当前,据我所知,在C/C++中常用的正则表达式库有GNU Regex Library, Boost.Regex, PCRE, PCRE++。这四个库中,后面两个是有关系,其它都是各自己独立的,是不同的实现。因此我会分三次,来一一对这四个库进行介绍。今天首先介绍一下GNU Regex Library。

1. 什么是GNU正则表达式库(GNU Regex Library) ?
GNU正则表达式库是glibc(GNU C Library)的一部分,它提供与POSIX标准兼容的正则表达式匹配的接口。
这里是其主页:http://www.gnu.org/s/libc/manual/html_node/Regular-Expressions.html
下载该库点这里:gnuregex0_13

2. GNU Regex Library所提供的接口
(1)regcomp:

[cpp]  view plain copy
  1. int regcomp(regex_t *preg, const char *pattern, int cflags)  
  2. 功能:将要进行匹配的正则表达式pattern进行编译,做匹配前的准备工作  
  3. 参数: preg, 输出参数,用来保存编译后的正则表达式结果  
  4.       pattern, 输入参数,传入要进行编译的正则表达式的字符串  
  5.       cflags, 输入参数,用来指定正则表达式匹配过程中的一些选项  
  6. 返回值:编译成功返回0,失败返回非0的错误码  

(2)regexec:

[cpp]  view plain copy
  1. <span style="color:#0000dd"></span><pre class="cpp" name="code">int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)  
  2. 功能:用来检测字符串string是否匹配正则表达式preg  
  3. 参数: preg, 输入参数,在(1)regcomp中编译好的正则表达式规则  
  4.       string, 输入参数,用来被匹配的字符串  
  5.       nmatch, 输入参数,用来指定pmatch参数所对应的数组的长度  
  6.       pmatch, 输出参数,用来输出在string中匹配preg的具体位置  
  7.       eflag, 输入参数,用来指定正则表达式匹配过程中的一些选项  
  8. 返回值: 如果string匹配preg所指定的规则,则返回0, 否则返回非0  
  9. </pre>  

(3)regerror:

[cpp]  view plain copy
  1. size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)  
  2. 功能:用来把在regcompt和regexec中产生的错误码转化成字符串形式的错误信息  
  3. 参数: errcode, 输入参数,在regcomp或regexec调用中返回的错误码  
  4.       preg, 输入参数,与错误码所对应的编译过的正则表达式结构  
  5.       errbuf, 输出参数,用来返回错误信息的buffer,如果buffer不够所需大小,错误信息将被截断  
  6.       errbuf_size, 输入参数,返回错误信息的buffer的大小   
  7. 返回值: 如果errbuf_size为0,那么regerror返回错误信息所需要的buffer的大小  

(4)regfree:

[cpp]  view plain copy
  1. void regfree (regex_t *preg)  
  2. 功能: 用来释放由regcomp编译时生成的preg结构所占用的内存  
  3. 参数: preg, 输入参数,由regcomp编译时生成的正则表达的结构指针  
  4. 返回值: 无  

3. 使用GNU Regex Library的一些注意事项
(1)regcomp与regfree必须配对使用,要不然会造成内存泄漏(类比malloc/free, new/delete)
(2)regex_t结构:把字符串形式的正则表达式编译成regex_t这样的一个结构,方便后续的匹配工作
(3)regmatch_t结构:用来表示正则表达式中字符串中匹配的位置的结构,用起始位置的偏移量来表示的
(4)flags:用来配置匹配过程中的一些选项, 指定如何匹配,具体参见:http://www.opengroup.org/onlinepubs/007908799/xsh/regcomp.html
(5)使用该库需要包含的头文件:sys/types.h和regex .h

4. GNU Regex Library使用举例

[cpp]  view plain copy
  1. <span style="color:#008000"></span><pre class="cpp" name="code">#include <sys /types.h>  
  2. #include <regex .h>  
  3. #include <stdio .h>  
  4.    
  5. int main(int argc, char ** argv)  
  6. {  
  7.     if (argc != 3)  
  8.     {  
  9.         printf("Usage: %s RegexString Text\n", argv[0]);  
  10.         return 1;  
  11.     }  
  12.    
  13.     const char * pRegexStr = argv[1];  
  14.     const char * pText = argv[2];  
  15.    
  16.     regex_t oRegex;  
  17.     int nErrCode = 0;  
  18.     char szErrMsg[1024] = {0};  
  19.     size_t unErrMsgLen = 0;  
  20.    
  21.     if ((nErrCode = regcomp(&oRegex, pRegexStr, 0)) == 0)  
  22.     {  
  23.         if ((nErrCode = regexec(&oRegex, pText, 0, NULL, 0)) == 0)  
  24.         {  
  25.             printf("%s matches %s\n", pText, pRegexStr);  
  26.             regfree(&oRegex);  
  27.             return 0;  
  28.         }  
  29.     }  
  30.    
  31.     unErrMsgLen = regerror(nErrCode, &oRegex, szErrMsg, sizeof(szErrMsg));  
  32.     unErrMsgLen = unErrMsgLen < sizeof(szErrMsg) ? unErrMsgLen : sizeof(szErrMsg) - 1;  
  33.     szErrMsg[unErrMsgLen] = '\0';  
  34.     printf("ErrMsg: %s\n", szErrMsg);  
  35.    
  36.     regfree(&oRegex);  
  37.     return 1;  
  38. }  
  39. </pre>  

程序测试:

[cpp]  view plain copy
  1. wuzesheng@wuzesheng-ubuntu:~/Program$ gcc TestRegex.c -o Regex  
  2. wuzesheng@wuzesheng-ubuntu:~/Program$ ./Regex "http:\/\/www\..*\.com" "https://www.taobao.com"  
  3. ErrMsg: No match  
  4. wuzesheng@wuzesheng-ubuntu:~/Program$ ./Regex "http:\/\/www\..*\.com" "http://www.taobao.com"  
  5. http://www.taobao.com matches http:\/\/www\..*\.com  

以上即是关于GNU Regex Library的全部内容。如果读书者朋友有什么看法可以在下面给我留言。接下来几天,我会陆续介绍前面提到的其它几个库,今天先到这里。

 

写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第二篇,如果对本文感兴趣,相信你也会对《深入浅出C/C++中的正则表达式库——GNU Regex Library》感兴趣。本文主要介绍Boost中的正则表达式库,通过介绍其基本内容与相关接口,希望能够教读者朋友学会如何使用该库。

1. 什么是Boost.Regex? 
Boost是C++中仅次于STL的一套库,它的功能比STL更加全面。这里是Boost的主页,想了解Boost的朋友可以看一下:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html。需要说明的一点是,Boost目前还不是C++标准库的一部分,因此如果要使用Boost中的库,需要自己安装一下。

Boost.Regex是Boost中的正则表达式库,它是由John Maddock提供的,它的全部文档在这里:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html

2. Boost.Regex的编译
最新的Boost库是1.42.0,在使用Boost.Regex之前,需要先下载Boost库,可以通过下面两种方式下载:
(1)Http下载,下载地址是http://sourceforge.net/projects/boost/files/boost/1.42.0/
(2)用svn客户端来下载,地址是:http://svn.boost.org/svn/boost/trunk/
我个人比较推荐使用svn客户端来下载,这样的话,如果要更新直接svn update一下,就不用再去重新下载了。

下载好了Boost库,下面开始编译, 本文中我以Linux平台为例进行说明,其它平台的编译方法参见上面提到的文档。下面是具体的步骤:(假设下载完后的,代码解压在了BOOST_ROOT目录)
(1)进入到BOOST_ROOT/libs/regex/build目录
(2)如果要使用静态库,请执行make -fgcc.mak
(3)如果要使用静态库,请执行make -fgcc-shared.mak
执行完上面三步后的,在BOOST_ROOT/libs/regex/build/下会生成一个gcc目录 ,进入该目录 ,可以看到生成了下面四个文件:
(1)libboost_regex-gcc-1_42.a , 这是release版的静态库
(2)libboost_regex-gcc-1_42.so, 这是release版的动态库(共享库)
(3)libboost_regex-gcc-d-1_42.a, 这是debug版的静态库
(4)libboost_regex-gcc-d-1_42.so, 这里debug版的动态库(共享库)
编译好之后的,就可以开始使用了。这里提供一个我编译好的版本,如果读者朋友不想自己编译,可以直接从我这里下载使用,下载完记得校验一下MD5: b6e0d805ea22ba08cb230ca98a517953。
点此下载:libboost_regex.tar.gz

3. Boost Regex Libray类和接口介绍
(1)basic_regex
basic_regex是一个模板类,它封装了正则表达式的解析和编译,它是Boost.Regex中用来表示正则表达式的对象类型。Boost.Regex定义了两种标准类型,一种是基于单字节字符的regex,另一种是基于宽字符的wregex
关于basic_regex提供的接口,和STL中basic_string所提供的十分类似,具体可以参考:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html

(2)match_results
match_results是用来表示所有匹配指定正则表达式的字符串的集合的对象类型。Boost.Regex提供了四种标准类型的定义:C单字节字符类型的cmatch, C宽字符类型的wcmatch, C++单字节字符类型smatch, C++宽字符类型wsmatch。match_results所提供的接口参见:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/match_results.html

(3)sub_match
sub_match是用来表示匹配指定正则表达式的字符串的对象类型。match_results就是由sub_match组成的集合类型。
关于sub_match类型,有下面三点需要注意的:
a. sub_match类型的对象只能通过对match_results类型的对象取下标获取
b. sub_match类型的对象可以和std:basic_string或const char*的字符串进行比较
c. sub_match类型的对象可以和std::basic_string或const char*的字符串相加,生成新的std::basic_string类型的字符串
sub_match所提供的接口请参考:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/sub_match.html

(4)reg_match, reg_search和reg_replace
reg_match, reg_search和reg_replace都是Boost.Regex所提供的具体进行正则匹配的算法接口。
reg_match用来判定整个字符串是否匹配指定的的正则表达式, 具体定义参见:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_match.html
reg_search用来判定字符串的某一部分是否匹配指定的正则表达式, 具体定义参见:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_search.html
reg_replace用来把字符串中匹配指定正则表达式的部分替换为指定内容输出,对于不匹配的部分原样输出, 具体定义参见:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html

4. Boost Regex Libray使用注意事项
(1)在使用之前你需要把Boost的安装目录加入到系统的Path中(当然也可以在编译时直接指定)
(2)需要包含的头文件 boost/regex.hpp
(3)需要依赖的库:下载2中编译好的libboost.tar.gz,取其中任意一个即可,具体如何使用动态/静态库,请自己查阅相关资料
(4)Boost.Regex还提供对Unicode类型的支持,具体细节参加上面提到的文档,我这里不做介绍

5. Boost.Regex使用举例
下面是Boost.Regex使用的一个简单的例子:

[cpp]  view plain copy
  1. <span style="color:#008000"></span> <pre class="cpp" name="code">#include <string>  
  2. #include <iostream>  
  3.    
  4. #include "boost/regex.hpp"  
  5.    
  6. int main(int argc, char ** argv)  
  7. {  
  8.     if (argc != 4)  
  9.     {     
  10.         std::cerr < < "Usage: " << argv[0] << " option regex text\n"  
  11.             << "option: 0 --whole match\n"  
  12.             << "        1 --sub match\n"  
  13.             << "        2 --replace match\n";  
  14.         return 1;  
  15.     }     
  16.    
  17.     boost::regex oRegex(argv[2]);  
  18.     boost::smatch oResults;  
  19.     std::string strStr(argv[3]);  
  20.     std::string strRes;  
  21.    
  22.     switch (atoi(argv[1]))  
  23.     {     
  24.         case 0:  
  25.             if(boost::regex_match(strStr, oResults, oRegex))  
  26.             {     
  27.                 std::cout << strStr << " matches " << oRegex << "\n";  
  28.             }     
  29.             else  
  30.             {     
  31.                 std::cout << strStr << " doesn't match " << oRegex << "\n";  
  32.             }     
  33.             break;  
  34.         case 1:  
  35.             if(boost::regex_search(strStr, oResults, oRegex))  
  36.             {  
  37.                 std::cout << strStr << " matches " << oRegex << "\n";  
  38.             }  
  39.             else  
  40.             {  
  41.                 std::cout << strStr << " doesn't match " << oRegex << "\n";  
  42.             }  
  43.             break;  
  44.         case 2:  
  45.             strRes = boost::regex_replace(strStr, oRegex, "$$");  
  46.             std::cout << "strRes=" << strRes << "\n";  
  47.             break;  
  48.         default:  
  49.             std::cerr << "Invalid option: " << argv[1] << "\n";  
  50.             break;  
  51.     }  
  52. }  
  53. </pre>  

 

 

下面是程序运行的结果:

[cpp]  view plain copy
  1. wuzesheng@wuzesheng-ubuntu:~/Program$ !g++  
  2. g++ -I./boost_1_42_0 BoostRegex.cpp -L ./boost_1_42_0/libs/regex/build/gcc/ -lboost_regex-gcc-1_42 -o BoostRegex  
  3. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 0 "http:\/\/www\..*\.com" "http://www.soso.comjfj"  
  4. http://www.soso.comjfj doesn't match http:\/\/www\..*\.com  
  5. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 1 "http:\/\/www\..*\.com" "http://www.soso.comjfj"  
  6. http://www.soso.comjfj matches http:\/\/www\..*\.com  
  7. wuzesheng@wuzesheng-ubuntu:~/Program$ ./BoostRegex 2 "http:\/\/www\..*\.com" "http://www.soso.comjfj"  
  8. strRes=$jfj  

以上即是Boost.Regex的主要的内容以及具体使用的一些情况。这里我需要说明一下,由于Boost.Regex所提供的像basic_regex, match_results, sub_match这些类型,它们的封装与C++中string等其它stl容器的封装很相似,因此使用过程中可以做联想类比,以加深理解。另外,像regex_match, regex_search, regex_replace这些算法都是模板函数,而且都有多个重载版本,在使用的时候,注意选择适合自己的应用场景的版本。

 
  

写在前面:本文是《深入浅出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/PcreDownload2. PCRE接口介绍(1). pcre_compile

[cpp]  view plain copy
  1. pcre <span style="color:#000040">*</span>pcre_compile<span style="color:#008000">(</span><span style="color:#0000ff">const</span> <span style="color:#0000ff">char</span> <span style="color:#000040">*</span>pattern, <span style="color:#0000ff">int</span> options,<span style="color:#0000ff">const</span> <span style="color:#0000ff">char</span> <span style="color:#000040">**</span>errptr, <span style="color:#0000ff">int</span> <span style="color:#000040">*</span>erroffset, <span style="color:#0000ff">const</span> <span style="color:#0000ff">unsigned</span> <span style="color:#0000ff">char</span> <span style="color:#000040">*</span>tableptr<span style="color:#008000">)</span><span style="color:#008080">;</span>  
  2. 功能:编译指定的正则表达式  
  3. 参数:pattern, 输入参数,将要被编译的字符串形式的正则表达式  
  4.       options, 输入参数,用来指定编译时的一些选项  
  5.       errptr, 输出参数,用来输出错误信息  
  6.       erroffset, 输出参数,pattern中出错位置的偏移量  
  7.       tableptr, 输入参数,用来指定字符表,一般情况用<span style="color:#0000ff">NULL</span>, 使用缺省的字符表  
  8. 返回值:被编译好的正则表达式的pcre内部表示结构  

(2). pcre_exec

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

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使用举例
下面是例程:

[cpp]  view plain copy
  1. <span style="color:#008000"></span><pre class="cpp" name="code">#include <pcre .h>  
  2. #include <stdio .h>  
  3. #include <string .h>  
  4.    
  5. int main(int argc, char ** argv)  
  6. {  
  7.     if (argc != 3)  
  8.     {     
  9.         printf("Usage: %s pattern text\n", argv[0]);  
  10.         return 1;  
  11.     }     
  12.    
  13.     const char * pPattern = argv[1];  
  14.     const char * pText = argv[2];  
  15.     const char * pErrMsg = NULL;  
  16.     pcre * pPcre = NULL;  
  17.     int nOffset = -1;   
  18.    
  19.     if (NULL == (pPcre = pcre_compile(pPattern, 0, &pErrMsg, &nOffset, NULL)))  
  20.     {     
  21.         printf("ErrMsg=%s, Offset=%d\n", pErrMsg, nOffset);  
  22.         return 1;  
  23.     }     
  24.     else  
  25.     {     
  26.         if (pcre_exec(pPcre, NULL, pText, strlen(pText), 0, 0, NULL, 0) < 0)  
  27.         {     
  28.             printf("%s doesn't match %s\n", pText, pPattern);  
  29.         }     
  30.         else  
  31.         {     
  32.             printf("%s matches %s\n", pText, pPattern);  
  33.         }  
  34.     }  
  35. }  
  36. </pre>  

下面是运行结果:

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

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

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

下面是运行结果:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值