如何使用正则表达式从 C++ 字符串中提取字符串

Posted

技术标签:

【中文标题】如何使用正则表达式从 C++ 字符串中提取字符串【英文标题】:How to extract strings from a c++ string using regex 【发布时间】:2011-05-04 00:34:13 【问题描述】:

我正在通过#include <regex.h> 使用正则表达式 如果我有一个字符串 s,我如何使用正则表达式来搜索模式 p?

【问题讨论】:

哪个 regex.h? Unix 的?您最好指定它,因为它不是标准的 C++ 或 C 头文件。 我只是使用已经存在的那个,所以默认的,不管是什么。我在OSX,和Linux基本一样。 你的编译器和操作系统是什么?无论如何,如果你想要跨平台和跨编译器的兼容性以及良好的 OO 接口,我建议尝试 Boost.Regex。 boost.org/doc/libs/1_46_1/libs/regex/doc/html/index.html 我在 OSX 中使用 g++。 您可以使用两个截然不同的正则表达式库。 #include <regex.h> 是 C 库,由 POSIX.1-2001 标准化。 #include <regex> 是 C++ TR1 中标准化的 C++ 库。您可能会发现 C++ 正则表达式库更有用。 【参考方案1】:
#include <regex.h>
#include <iostream>
#include <string>

std::string
match(const char *string, char *pattern)


// Adapted from:
   http://pubs.opengroup.org/onlinepubs/009695399/functions/regcomp.html

    int    status;
    regex_t    re;
    regmatch_t rm;


    if (regcomp(&re, pattern, REG_EXTENDED) != 0) 
        return "Bad pattern";
    
    status = regexec(&re, string, 1, &rm, 0);
    regfree(&re);
    if (status != 0) 
        return "No Match";
    
    return std::string(string+rm.rm_so, string+rm.rm_eo);


int main(int ac, char **av) 
    // e.g. usage: ./program abcdefg 'c.*f'
    std::cout << match(av[1], av[2]) << "\n";

【讨论】:

【参考方案2】:

检查http://msdn.microsoft.com/en-us/library/bb982821.aspx,有详细的正则表达式使用模式。来自 MS vc 博客。

      const regex r("[1-9]\\d*x[1-9]\\d*");

      for (string s; getline(cin, s); ) 
               cout << (regex_match(s, r) ? "Yes" : "No") << endl;
      

【讨论】:

详细说明&lt;regex&gt;的用法。 OP 要求提供&lt;regex.h&gt; 的示例。它们不是同一个 API。

以上是关于如何使用正则表达式从 C++ 字符串中提取字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式提取此字符串的坐标的 3 个数值,无论它们是正数值坐标还是负数值坐标

如何使用正则表达式和外壳从字符串中提取值?

使用正则表达式在 C++ 中提取匹配的字符串

如何在 C# 中使用正则表达式从字符串中提取域名?

如何使用正则表达式从字符串中提取第 n 个 URL?

如何使用正则表达式从字符串中提取文件名[重复]