3

假设我想使用 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 中对正则表达式的支持有多差。

4

1 回答 1

4

你的模式是正确的。您的代码在很大程度上是正确的,到处都缺少“std”(对于“cout”、“endl”和 regex_match),或者至少不一致(假设您正在“使用命名空间 std”)。

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

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

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

于 2012-11-05T12:31:27.993 回答