Sha*_*Guy 54 c++ regex gcc c++11
好吧,这不是我遇到这个问题的原始程序,但是我把它复制得更小了.非常简单的问题.
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;
}
Run Code Online (Sandbox Code Playgroud)
使用此命令成功编译,没有错误消息:
$ g++ -std=c++0x main.cpp
Run Code Online (Sandbox Code Playgroud)
g++ -v顺便说一下,最后一行是:
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时的结果:
$ ./a.out
S works.
. works.
.+ works.
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted
Run Code Online (Sandbox Code Playgroud)
如果我将r4更改为,,或者\\s,它会以相同的方式发生.这是编译器的问题吗?我或许可以相信C++ 11的正则表达式引擎有不同的方式来表达"空白"或"单词字符",但方括号不起作用是一个延伸.它是否已在4.6.2中得到修复?\\w[a-z]
编辑:
约阿希姆Pileborg已提供的部分解决方案,使用额外的regex_constants参数,以使支撑方括号语法,但既不basic,extended,awk,也不ECMAScript似乎支持反斜杠转义术语如\\s,\\w,或\\t.
编辑2:
使用原始字符串(R"(\w)"而不是"\\w")似乎也不起作用.
jfs*_*jfs 33
更新:<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;
}
Run Code Online (Sandbox Code Playgroud)
有用:
$ g++ -std=c++0x *.cc -lboost_regex && ./a.out 1
Run Code Online (Sandbox Code Playgroud)
根据C++ 11标准(28.8.2)默认basic_regex()使用regex_constants::ECMAScriptflag,因此必须理解这种语法.
这个C++ 11正则表达式错误我或编译器?
gcc-4.6.1不支持c ++ 11正则表达式(28.13).
Som*_*ude 29
该错误是因为默认情况下创建正则表达式使用表达式的ECMAScript语法,该语法不支持括号.您应该使用basicor extended标志声明表达式:
std::regex r4("[0-9]", std::regex_constants::basic);
Run Code Online (Sandbox Code Playgroud)
编辑看起来像libstdc ++(GCC的一部分,以及处理所有C++东西的库)还没有完全实现正则表达式.在他们的状态文档中,他们说修改的ECMAScript正则表达式语法尚未实现.
正则表达式支持在gcc 4.8.2和4.9.2之间得到改善.例如,正则表达式=[A-Z]{3}失败了:
正则表达式错误
升级到gcc 4.9.2后,它按预期工作.