首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是C++11正则表达式错误是我还是编译器?

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

Stack Overflow用户
提问于 2011-11-09 11:33:07
回答 2查看 60.6K关注 0票数 57

好吧,这不是我遇到这个问题的原始程序,但我复制了一个小得多的程序。很简单的问题。

main.cpp:

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
$ g++ -std=c++0x main.cpp

顺便说一下,g++ -v的最后一行是:

代码语言:javascript
复制
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

当我尝试运行它时,结果是:

代码语言:javascript
复制
$ ./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参数启用支持方括号的语法,但basicextendedawkECMAScript似乎都不支持反斜杠转义的术语,如\\s\\w\\t

EDIT 2:

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

EN

回答 2

Stack Overflow用户

发布于 2011-11-09 11:49:04

这个错误是因为在默认情况下创建正则表达式时,表达式使用ECMAScript语法,这不支持方括号。应使用basicextended标志声明表达式:

代码语言:javascript
复制
std::regex r4("[0-9]", std::regex_constants::basic);

编辑看起来像libstdc++ (是GCC的一部分,处理所有C++内容的库)还没有完全实现正则表达式。在他们的status document中,他们说修改后的ECMAScript正则表达式语法还没有实现。

票数 31
EN

Stack Overflow用户

发布于 2014-12-04 20:38:40

在gcc 4.8.2和4.9.2之间,Regex支持得到了改进。例如,正则表达式=[A-Z]{3}对我来说是失败的,因为:

正则表达式错误

升级到gcc 4.9.2后,工作正常。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8060025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档