深入浅出C/C++中的正则表达式库(一)--GNU Regex Library

简介:

正则表达式(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. int regcomp(regex_t *preg, const char *pattern, int cflags) 
  2. 功能:将要进行匹配的正则表达式pattern进行编译,做匹配前的准备工作 
  3. 参数: preg, 输出参数,用来保存编译后的正则表达式结果 
  4.       pattern, 输入参数,传入要进行编译的正则表达式的字符串 
  5.       cflags, 输入参数,用来指定正则表达式匹配过程中的一些选项 
  6. 返回值:编译成功返回0,失败返回非0的错误码 
  7.  
  8.  
  9. int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[],  
  10.             int eflags) 
  11. 功能:用来检测字符串string是否匹配正则表达式preg 
  12. 参数: preg, 输入参数,在(1)regcomp中编译好的正则表达式规则 
  13.       string, 输入参数,用来被匹配的字符串 
  14.       nmatch, 输入参数,用来指定pmatch参数所对应的数组的长度 
  15.       pmatch, 输出参数,用来输出在string中匹配preg的具体位置 
  16.       eflag, 输入参数,用来指定正则表达式匹配过程中的一些选项 
  17. 返回值: 如果string匹配preg所指定的规则,则返回0, 否则返回非0 
  18.  
  19.  
  20. size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) 
  21. 功能:用来把在regcompt和regexec中产生的错误码转化成字符串形式的错误信息 
  22. 参数: errcode, 输入参数,在regcomp或regexec调用中返回的错误码 
  23.       preg, 输入参数,与错误码所对应的编译过的正则表达式结构 
  24.       errbuf, 输出参数,用来返回错误信息的buffer,如果buffer不够所需大小,错误信息将被截断 
  25.       errbuf_size, 输入参数,返回错误信息的buffer的大小  
  26. 返回值: 如果errbuf_size为0,那么regerror返回错误信息所需要的buffer的大小 
  27.  
  28.  
  29. void regfree (regex_t *preg) 
  30. 功能: 用来释放由regcomp编译时生成的preg结构所占用的内存 
  31. 参数: preg, 输入参数,由regcomp编译时生成的正则表达的结构指针 
  32. 返回值: 无 

 

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使用举例

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

程序测试:

 
  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的全部内容。如果读书者朋友有什么看法可以在下面给我留言。接下来几天,我会陆续介绍前面提到的其它几个库,今天先到这里。

 

 本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/887129,如需转载请自行联系原作者

相关文章
|
6月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
155 6
|
6月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
169 10
|
3月前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
84 11
|
4月前
|
Ubuntu 开发工具 C++
Ubuntu 22.04上编译安装c++ libconfig library
通过本文的介绍,我们详细讲解了如何在Ubuntu 22.04上编译和安装libconfig库,并通过编写和运行一个简单的测试程序来验证安装是否成功。libconfig库的安装过程相对简单,主要包括环境准备、下载源码、编译和安装几个步骤。希望本文对您在项目中使用libconfig库有所帮助。
274 13
|
6月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
113 5
|
6月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
119 1
|
11月前
|
编译器 Linux 开发工具
|
3月前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
171 23
深入理解GCC 和 G++ 编译器
|
8月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
6月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
188 11

推荐镜像

更多
下一篇
oss创建bucket