C ++正则表达式匹配花括号内的内容

时间:2012-11-05 07:32:08

标签: c++ regex gcc c++11 std

假设我想使用C ++ 11正则表达式提取匹配花括号的内容。因此,例如,{foo}将成功匹配,我可以使用match_result来提取内容。看起来很简单,但是下面的代码并没有完全符合我的意愿

std::string foo("{foo}");
std::regex r("\\{(.*)\\}");
std::smatch m;
bool result = regex_match(foo, m, r); // result returns true

cout << m[0] << endl; // prints: {foo}
cout << m[1] << endl; // prints: {foo} instead of just foo as I would expect

现在不应该m[1]只返回foo而不是大括号,因为它是第一个捕获组?

编辑:此问题的一个重要信息是我正在使用的编译器是GCC 4.6.3(目前是Ubuntu 12.04 LTS中的最新存储库版本)。答案确切地说明了对GCC正则表达式的支持程度有多差。

1 个答案:

答案 0 :(得分:3)

你的模式是正确的。你的代码基本上是正确的,很少有'std'在这里和那里('cout','endl'和regex_match),或者至少是不一致的(假设你'使用命名空间std')。

此外,在Visual Studio 2012上,您的代码输出预期结果。我没有尝试2010年,但我怀疑它也在那里运行(微软在2010年将TR1纳入其中)。

我怀疑你正在使用gcc。正如@Artyom指出的那样,在gcc / libstdc ++中没有实现。它编译好没有警告,但它给出了错误的结果。尽管人们普遍认为gcc在每个领域都优于微软,但在正则表达式中并非如此。

在gcc上查找正则表达式的状态: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x