STD=C++ 11与STD= GNU++ 11的C++标准正则表达式差

STD=C++ 11与STD= GNU++ 11的C++标准正则表达式差,c++,regex,c++11,gcc,gnu,C++,Regex,C++11,Gcc,Gnu,在使用正则表达式和gnu扩展编写代码时,正则表达式的行为似乎有所不同 以下代码在使用-std=c++11编译时生成异常,但是-std=gnu++11可以工作: #include <regex> #include <iostream> int main(int argc, char **argv) { std::string rex { "\\[1\\]" }; std::string str { "[1]" }; std::regex rege

在使用正则表达式和gnu扩展编写代码时,正则表达式的行为似乎有所不同

以下代码在使用-std=c++11编译时生成异常,但是-std=gnu++11可以工作:

#include <regex>
#include <iostream>

int main(int argc, char **argv) {

    std::string rex { "\\[1\\]" };
    std::string str { "[1]" };
    std::regex regex(rex, std::regex::extended);
    auto match = std::regex_match(str.begin(), str.end(), regex);
    std::cout << "Result is " << match << std::endl;
    return 0;
}

我用同样的行为尝试了从4.9.4到9.2的gcc。你知道为什么这段代码的行为不同吗?

std::regex::extended uses。根据这些语法规则,反斜杠只能位于特殊字符之前,该字符是[\*+?{{124;^$之一。而左括号[是特殊字符,右括号]不是。因此,正则表达式应为\\[1]而不是\\[1\\],以符合标准

查看标准库源代码,中包含以下内容:

这表明它是一个允许转义非特殊字符的GNU扩展。我不知道这个扩展在哪里被记录。

查看标准库源代码,中包含以下内容:


这表明它是一个允许转义非特殊字符的GNU扩展。我不知道这个扩展在哪里被记录。

没有错误消息吗?当使用-std=c++11时,我得到了一个运行时异常,类型为regex_error,当然可以捕获。然后我们看到异常消息是意外的转义字符。这很简单复制。但是为什么它与gnu++11一起工作?我找不到任何关于regexIs的可能扩展的描述。没有错误消息吗?当使用-std=c++11时,我得到了一个regex_error类型的运行时异常,当然可以捕获。然后我们看到异常消息是意外的转义字符。很容易复制。但是为什么它能与gnu++11一起工作呢?我找不到任何关于regexThanks的可能扩展的描述。有趣的是,旧的regex.h实现对此并不严格。我正在修改的实际代码使用了regex.h,在更改为c++11之后出现了异常。非常感谢。有趣的是,这一点旧的regex.h实现对此并不严格。我正在调整的实际代码使用了regex.h,在更改为c++11之后出现了异常。
#ifdef __STRICT_ANSI__
      // POSIX says it is undefined to escape ordinary characters
      __throw_regex_error(regex_constants::error_escape,
                  "Unexpected escape character.");
#else
      _M_token = _S_token_ord_char;
      _M_value.assign(1, __c);
#endif