是\ 0(C风格的正则表达式字符串中的"\\ 0")是C++正则表达式中的有效转义序列吗?

Cor*_*lks 8 javascript c++ regex ecma262 c++11

注意:当我说正则表达式时,[\0]我指的是正则表达式[\0](不包含在C风格的字符串中,然后就是这样"[\\0]").如果我没有在它周围加上引号,那么它不是C风格的字符串,反斜杠不应该被解释为转义为C风格的字符串.

受到这个问题和我的调查的启发,我在clang 3.4中尝试了以下代码:

#include <regex>
#include <string>

int main()
{
    std::string input = "foobar";
    std::regex regex("[^\\0]*"); // Note, this is "\\0", not "\0"!

    return std::regex_match(input, regex);
}
Run Code Online (Sandbox Code Playgroud)

显然,clang并不喜欢这样,因为它抛出:

std::__1::regex_error:表达式包含无效的转义字符或尾随转义.

它似乎是[^\0]部分(改变它[^\n]或类似的东西工作正常).它似乎是一个无效的转义字符.我想澄清一点,我不是在讨论'\0'字符(空字符)或'\n'字符(换行符).在C风格的字符串中,我所说的是"\\0"(包含反斜杠零的字符串)"\\n"(包含反斜杠n的字符串)."\\n"似乎"\n"被正则表达式引擎转化为了它,但它扼杀了"\\0".

C++ 11标准在第28.13节[re.grammar]中说:

basic_regexECMMAcript标志构造的对象识别的正则表达式语法是由ECMA-262指定的,除非如下所述.

我不是ECMA-262的专家,但是我在JSFiddle上尝试了正则表达式,它在JavaScript领域工作得很好.

所以现在我想知道正则表达式[^\0]是否在ECMA-262中有效并且C++ 11标准删除了对它的支持(在后面的内容中... except as specified below.).

问题:C++ 11正则表达式中的\0(不是空字符;在字符串文字中这是"\\0")转义序列是合法的吗?在ECMA-262中是合法的(或浏览器JS虚拟机只是"太"宽松)?不同行为的原因/理由是什么?

Bil*_*nch 2

这是 libc++ 的 实现中的一个错误<regex>。它现在应该在主干中修复,并且最终应该传播到 OS X 的发布代码。

\n\n

另外,以下是 ECMA 262 标准的摘录,该标准是此错误报告的基础:

\n
\n

15.10.2.11 小数转义

\n

产量DecimalEscape :: DecimalIntegerLiteral [lookahead \xe2\x88\x89 DecimalDigit]评价如下:

\n
    \n
  1. 令 i 为 DecimalIntegerLiteral 的 MV。
  2. \n
  3. 如果 i 为零,则返回由 <NUL> 字符(Unicode 值 0000)组成的 EscapeValue。
  4. \n
  5. 返回由整数 i 组成的 EscapeValue。
  6. \n
\n

注意:... \\0 代表<NUL> 字符,后面不能跟十进制数字。

\n
\n