[英]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]
评估如下:
- 让我成为DecimalIntegerLiteral的MV。
- 如果i为零,则返回由<NUL>字符(Unicode值0000)组成的EscapeValue。
- 返回由整数i组成的EscapeValue。
注意:... \\ 0表示<NUL>字符,不能跟十进制数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.