c++ - 这是 C++11 正则表达式错误我还是编译器?

标签 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;
}

使用此命令编译成功,没有错误信息:

$ 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[a-z],也会发生同样的情况。这是编译器的问题吗?我可能会相信 C++11 的正则表达式引擎有不同的方式来表示“空格”或“单词字符”,但方括号不起作用是一个延伸。这是 4.6.2 中修复的问题吗?

编辑:

Joachim Pileborg 提供了部分解决方案,使用额外的 regex_constants 参数来启用支持方括号的语法,但既不支持 basic,也不支持 extendedawkECMAScript 似乎都不支持反斜杠转义的术语,例如 \\s\\w、或 \\t.

编辑 2:

使用原始字符串(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默认情况下标记,因此它必须理解此语法。

Is this C++11 regex error me or the compiler?

gcc-4.6.1 doesn't support c++11 regular expressions (28.13) .

关于c++ - 这是 C++11 正则表达式错误我还是编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8060025/

相关文章:

c++ - 从线程抛出异常没有给出预期的结果

javascript - 在 .Net 1.1 上使用两次正面前瞻不起作用

regex - 从文本文件中获取数据

c - 将外部库的头文件包含在另一个头文件中

c - C 中的递归合并排序和内存分配

gcc - 一起编译 binutils 和 gcc 的方法?

c++ - 使用在另一个 BPL 中实现的组件安装 BPL

c++ - WinbioOpensession 返回 E_ACCESSDENIED?

C++,如何标记这个字符串?

java - 替换Java字符串中的xml特殊字符