1 正则表达式标准库

C++11 正式将正则表达式的的处理方法纳入标准库,从语言级上提供了标准的支持。常用方法如下:

  • std::regex: (本质是 std::basic_regex),初始化正则对象
  • std::regex_match(fname , txt_regex): 匹配字符串和正则表达式。匹配成功时,会返回 true,否则返回 false。
  • std::regex_match(fname , base_match , base_regex):匹配并返回匹配到的结果到第二个参数。

例子example_13 code:

  1. #include <iostream>
  2. #include <string>
  3. #include <regex>
  4. using namespace std;
  5. int main()
  6. {
  7. string files[]={"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};
  8. //生成正则对象
  9. regex txt_regex("[a-z]+\\.txt");
  10. //仅查询
  11. for (const auto &file : files)
  12. {
  13. cout<<file<<": "<<regex_match(file, txt_regex)<<endl;
  14. }
  15. smatch matches;
  16. for (const auto &file : files)
  17. {
  18. if (regex_match(file, matches, txt_regex))
  19. {
  20. //smatch第一个元素为整个字符串
  21. cout<<"whole string: "<<matches[0].str()<<endl;
  22. cout<<"match: "<<matches[1].str()<<endl;
  23. }
  24. }
  25. }

2 Linux平台原始正则表达式

在Linux平台上,有一个regex.h提供了原始的C语言的正则表达式支持,主要有以下几个函数:

  • int regcomp(regex_t _preg, const char _regex, int cflags);
  • int regexec(const regex_t _preg, const char _string, size_t nmatch, regmatch_t pmatch[], int eflags);
  • size_t regerror(int errcode, const regex_t _preg, char _errbuf, size_t errbuf_size);
  • void regfree(regex_t *preg);

regmatch_t数组用来存储匹配的结果,该参数为数组的原因实际上是为了匹配group,其规则和Java等实现一致,若匹配成功,数组的[0]为整个匹配串,即group(0),其他为各个匹配到的组。匹配失败则rm_eo-rm_so=0。

  1. //rm_so为匹配字符串起始偏移(start offset),rm_eo为匹配字符串的终止偏移(end offset)。
  2. typedef struct {
  3. regoff_t rm_so;
  4. regoff_t rm_eo;
  5. } regmatch_t;

代码示例如下:

  1. #include <stdio.h>
  2. #include <regex.h>
  3. #include <string.h>
  4. int main(void)
  5. {
  6. const char *str = "itf:e1;crc4:enabled;xxx";
  7. const char *pattern = "^itf:(e1|t1)?(;(crc4):([0-9a-zA-Z_]*))?(;(t1fm):([0-9a-zA-Z_]*))?(;(t1tx):([0-9a-zA-Z_]*))?(;(t1rx):([0-9a-zA-Z_]*))?(;(.*))?$";
  8. regex_t reg;
  9. regmatch_t match[16];
  10. int ret = 0;
  11. ret = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);
  12. if(ret != 0)
  13. printf("error\n");
  14. else
  15. {
  16. ret = regexec(&reg, str, 16, match, 0);
  17. if(ret != REG_NOMATCH)
  18. {
  19. char buf[1024] = {0};
  20. for (int i=1;i<=15;i++)
  21. {
  22. memset(buf, 0, 1024);
  23. int len = match[i].rm_eo - match[i].rm_so;
  24. memcpy(buf, str + match[i].rm_so, len);
  25. printf("get buf: %s\n", buf);
  26. }
  27. }
  28. else
  29. {
  30. printf("match nothing\n");
  31. }
  32. }
  33. regfree(&reg);
  34. return 0;
  35. }