这是C + + 11正则expression式错误我还是编译器?

好的,这不是我遇到这个问题的原始程序,但是我把它复制到了一个更小的程序中。 很简单的问题。

main.cpp中:

#include <iostream> #include <regex> using namespace std; int main() { regex r1("S"); printf("S works.\n"); regex r2("."); printf(". works.\n"); regex r3(".+"); printf(".+ works.\n"); regex r4("[0-9]"); printf("[0-9] works.\n"); return 0; } 

用这个命令编译成功,没有错误信息:

 $ g++ -std=c++0x main.cpp 

顺便提一句, g++ -v的最后一行是:

 gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 

而当我尝试运行它的结果:

 $ ./a.out S works. . works. .+ works. terminate called after throwing an instance of 'std::regex_error' what(): regex_error Aborted 

如果我将r4更改为\\s\\w或者[az] ,也会发生同样的情况。 这是编译器的问题吗? 我可能会相信C ++ 11的正则expression式引擎有不同的方式来表示“空格”或“单词字符”,但方括号不起作用是一个延伸。 这是4.6.2中的问题吗?

编辑:

Joachim Pileborg提供了一个部分解决scheme,使用额外的regex_constants参数来启用支持方括号的语法,但是basicextendedawkECMAScript都不支持\\s\\w\\t

编辑2:

使用原始string( R"(\w)"而不是"\\w" )似乎也不起作用。

更新: <regex>现已在GCC 4.9.0中实现和发布


老答案:

ECMAScript语法接受[0-9]\s\w等,参见ECMA-262(15.10) 。 下面是boost::regex的例子,默认情况下也使用ECMAScript语法:

 #include <boost/regex.hpp> int main(int argc, char* argv[]) { using namespace boost; regex e("[0-9]"); return argc > 1 ? !regex_match(argv[1], e) : 2; } 

有用:

 $ g++ -std=c++0x *.cc -lboost_regex && ./a.out 1 

根据C ++ 11标准(28.8.2), basic_regex()默认使用regex_constants::ECMAScript标志,所以它必须理解这个语法。

这是C + + 11正则expression式错误我还是编译器?

gcc-4.6.1不支持c ++ 11正则expression式(28.13) 。

该错误是因为默认情况下创build正则expression式使用ECMAScript语法的expression式,不支持括号。 您应该用basicextended标志声明expression式:

 std::regex r4("[0-9]", std::regex_constants::basic); 

编辑看起来像libstdc ++(GCC的一部分,处理所有C ++的东西的库)还没有完全实现正则expression式。 在他们的状态文件中,他们说修改后的ECMAScript正则expression式语法还没有实现。

在gcc 4.8.2和4.9.2之间改进了Regex支持。 例如,正则expression式=[AZ]{3}对我来说是失败的:

正则expression式错误

升级到gcc 4.9.2后,它按预期工作。