C ++ 11 std :: regex_match返回额外的字符

时间:2012-10-16 08:37:37

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

  

可能重复:
  Is gcc4.7 buggy about regular expressions?

我按照http://www.cplusplus.com/reference/std/regex/regex_match/上的示例编译并使用g ++版本4.6.3在64位Ubuntu 12.04上编译

以下是我的输出:

string literal matched
string object matched
range matched
string literal with 3 matches
string object with 3 matches
range with 3 matches
the matches were: [subject] [sub] [bject] 

示例输出为:

string literal matched
string object matched
range matched
string literal with 3 matches
string object with 3 matches
range with 3 matches
the matches were: [subject] [sub] [ject]

请注意,在我的机器上 [bject] 被提取,这是不正确的。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

根据gcc implementation status (ver 4.6.3),正则表达式库尚未完全实现。它不会抛出任何错误,也不会提供任何警告。这确实是令人不快的。

然而,其他人之前已经观察过这种情况,也有更新的版本:

常见的建议是进一步使用Boost.Regex或尝试其他编译器。

请参阅this answer进一步阅读。

答案 1 :(得分:0)

您可以将示例缩小为:

std::string s("subject");
std::regex e("(sub)(.*)");
std::smatch sm;
std::regex_match(s, sm, e);

更有趣:

std::string s("subject");
std::regex e("(sub)(ject)");
std::smatch sm;
std::regex_match(s, sm, e);

所以,这看起来像是GNU实现中的一个错误。