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

C++ 这是C++;11正则表达式错误我还是编译器?,c++,regex,gcc,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(".+");

好的,这不是我遇到这个问题的原始程序,但我在一个小得多的程序中复制了它。非常简单的问题

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++-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_常量
参数来启用支持方括号的语法,但是
basic
extended
awk
ECMAScript
似乎都不支持反斜杠转义词,如
\\s
\\w
,或
\\t

编辑2:


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

错误是因为默认情况下创建正则表达式使用不支持方括号的ECMAScript语法。您应该使用
basic
extended
标志声明表达式:

std::regex r4("[0-9]", std::regex_constants::basic);
<> > >编辑< /St>看起来像LIbSTDC++ +(GCC的一部分,处理所有C++内容的库)还没有完全实现正则表达式。在他们的报告中,他们说修改后的ECMAScript正则表达式语法尚未实现。

更新:
现已在GCC4.9.0中实现并发布


旧答案:

ECMAScript语法接受
[0-9]
\s
\w
等,请参阅。下面是一个默认情况下也使用ECMAScript语法的
boost::regex
示例:

#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;
}
根据C++11标准(28.8.2)
basic_regex()
默认使用
regex_常量::ECMAScript
标志,因此它必须理解此语法

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


.

在gcc 4.8.2和4.9.2之间改进了正则表达式支持。例如,regex
=[A-Z]{3}
在以下方面对我来说是失败的:

正则表达式错误


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

我还没有使用正则表达式类,但是您确定使用的是正确的吗?我记得C++11有几种不同的解释正则表达式的方法。在
regex\u错误中是否有有用的信息?您知道如何捕获异常吗?如果捕获
regex\u error
它将有一个名为
code()
的方法,该方法将从
std::regex\u constants::error\u type
返回一个常量。有关它们的含义,请参见。问题仍然存在于g++-4.8.1中。没有\w,没有[a-z]。这可能是一种令人失望的重复。为什么他们会把默认值设置得如此奇怪?真烦人。关于不同的语法有什么好的文档吗?@ShayGuy-这一页包含一个可能的语法列表:-我打赌
::std::regex_常量::extended
会有用。@Omnifarious请参阅不同的表达式类型。@JoachimPileborg-找到了。但是它并没有说不同的语法允许或不允许什么东西。-1:。就像我在编辑中说的,我现在的问题是反斜杠,而不是方括号。我不明白你的最后一点——我一直在使用那个编译器,其中一些正则表达式一直在工作。此外,我在那一页上没有看到任何特别提到4.6.1的内容。@Shay Guy:1。ECMAScript语法还支持反斜杠和更多(如果您更熟悉perl5正则表达式语法,则该语法与之类似)。2.如果gcc的当前主干(未来)不支持正则表达式,那么gcc-4.6.1(过去)就不支持正则表达式。我仍然不支持。如果gcc不支持正则表达式,那么为什么这些都可以工作而不抛出错误呢?即使是方括号也可以处理一些
regex_常量
参数,尽管反斜杠不起作用。@Shay Guy:说有些东西是部分支持的。转到页面,查找
28
(正则表达式部分)。@ShayGuy-这显然是正确的答案。不幸的是,g++的libstdc++还不支持完整的正则表达式。让您的代码可以自由地从boost转换的一个解决方案是您自己的名称空间和一系列使用指令,以从boost或std名称空间导入您需要的内容。实际上,4.8有std::regex类和friends,但对regex语言的支持不完整,因此您的代码将编译,但不符合预期。我能够阅读简短的注释,甚至点击链接。我们似乎对“支持”的定义有分歧,但未必如此。GCC4.8根本不支持所提供的正则表达式实现,已知它不是一个实际的C++11正则表达式实现。它不符合要求,也从未被视为符合要求。不幸的是,它被装在一个可以通过
访问的标题中发运。这是我的观点。
#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