这个C++ 11正则表达式错误我或编译器?

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正则表达式语法尚未实现.

  • -1:[ECMAScript支持`[0-9]`](http://stackoverflow.com/questions/8060025/is-this-c11-regex-error-me-or-the-compiler/8061172#8061172). (7认同)
  • 这有点令人失望.为什么他们让默认的东西变得如此奇怪?多烦啊 是否有各种语法可以在任何地方找到好的文档? (4认同)
  • @ShayGuy - 此页面包含可能的语法列表:http://en.cppreference.com/w/cpp/regex/syntax_option_type - 我打赌`:: std :: regex_constants :: extended`可以正常工作. (2认同)

Dre*_*kes 7

正则表达式支持在gcc 4.8.2和4.9.2之间得到改善.例如,正则表达式=[A-Z]{3}失败了:

正则表达式错误

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

  • 通过"gcc 4.8.2和4.9.2之间的支持改进",你真正想说的是"GCC 4.8没有正则表达式支持; GCC 4.9具有正则表达式支持".[4.9版本之前的实验标题的可用性是一个令人遗憾和误导性的历史遗产](http://stackoverflow.com/a/12665408/560648). (5认同)
  • 实际上4.8有std :: regex类和朋友,但对正则表达式语言的支持是不完整的,因此你的代码会编译但不符合预期. (4认同)