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_regex
ECMMAcript标志构造的对象识别的正则表达式语法是由ECMA-262指定的,除非如下所述.
我不是ECMA-262的专家,但是我在JSFiddle上尝试了正则表达式,它在JavaScript领域工作得很好.
所以现在我想知道正则表达式[^\0]
是否在ECMA-262中有效并且C++ 11标准删除了对它的支持(在后面的内容中... except as specified below.
).
问题:C++ 11正则表达式中的\0
(不是空字符;在字符串文字中这是"\\0"
)转义序列是合法的吗?在ECMA-262中是合法的(或浏览器JS虚拟机只是"太"宽松)?不同行为的原因/理由是什么?
这是 libc++ 的 实现中的一个错误<regex>
。它现在应该在主干中修复,并且最终应该传播到 OS X 的发布代码。
另外,以下是 ECMA 262 标准的摘录,该标准是此错误报告的基础:
\n\n\n15.10.2.11 小数转义
\n产量
\nDecimalEscape :: DecimalIntegerLiteral [lookahead \xe2\x88\x89 DecimalDigit]
评价如下:\n
\n- 令 i 为 DecimalIntegerLiteral 的 MV。
\n- 如果 i 为零,则返回由 <NUL> 字符(Unicode 值 0000)组成的 EscapeValue。
\n- 返回由整数 i 组成的 EscapeValue。
\n注意:... \\0 代表<NUL> 字符,后面不能跟十进制数字。
\n