繁体   English   中英

\\ 0(C风格的正则表达式字符串中的“ \\\\ 0”)在C ++正则表达式中是否有效?

[英]Is \0 (“\\0” in a C-style regex string) a valid escape sequence in C++ regular expressions?

注意 :当我说正则表达式[\\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);
}

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

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

它似乎是[^\\0]部分(将其更改为[^\\n]或类似的方法也可以)。 它似乎是无效的转义字符。 我想澄清的是,我不是在说'\\0'字符(空字符)或'\\n'字符(换行符)。 在C风格的字符串中,我要说的是"\\\\0" (包含反斜杠零的字符串) "\\\\n" (包含反斜杠n的字符串)。 regex引擎似乎将"\\\\n"转换为"\\n" ,但它对"\\\\0"了阻塞。

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

由ECMAScript标志构造的basic_regex对象识别的正则表达式语法是ECMA-262指定的语法,以下指定除外。

我不是ECMA-262的专家,但是我在JSFiddle上尝试了正则表达式,并且在JavaScript领域可以正常工作。

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

问题\\0 (不是空字符;在字符串文字中为"\\\\0" )在C ++ 11正则表达式中是否合法? 在ECMA-262中是否合法(或者浏览器JS VM太“宽松”了)? 什么是不同行为的原因/合理性?

这是libc ++的<regex>实现中的错误。 现在应该在主干中对其进行修复,并且最终应将其传播到OS X的发行代码。

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

15.10.2.11 DecimalEscape

产生的DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit]评估如下:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM