这是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
参数来启用支持方括号的语法,但是basic
, extended
, awk
和ECMAScript
都不支持\\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式,不支持括号。 您应该用basic
或extended
标志声明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后,它按预期工作。