Javascript 正则表达式中字符类中的十进制转义

Javascript 正则表达式中字符类中的十进制转义,javascript,regex,standards,pcre,Javascript,Regex,Standards,Pcre,有人能根据ECMAScript标准解释字符类中十进制转义的语义吗 例如,下面的模式意味着什么?它应该抛出语法错误吗 [\11] 以下是核心规范的相关章节: 生产类Escape::DecimalEscape的计算结果如下: 评估DecimalEscape以获得Escape值E。 如果E不是字符,则引发SyntaxError异常。 让他成为他的性格。 返回包含字符ch的单元素字符集。 生产DecimalEscape::DecimalIntegerLiteral的计算结果如下: 让我成为十进制文字的

有人能根据ECMAScript标准解释字符类中十进制转义的语义吗

例如,下面的模式意味着什么?它应该抛出语法错误吗

[\11]
以下是核心规范的相关章节:

生产类Escape::DecimalEscape的计算结果如下:

评估DecimalEscape以获得Escape值E。 如果E不是字符,则引发SyntaxError异常。 让他成为他的性格。 返回包含字符ch的单元素字符集。 生产DecimalEscape::DecimalIntegerLiteral的计算结果如下:

让我成为十进制文字的MV。 如果i为零,则返回由字符U+0000 NULL组成的EscapeValue。 返回由整数i组成的EscapeValue。 11.8.3中给出了“十进制文字的MV”的定义

笔记 如果\后跟第一位数字不是0的十进制数n,则转义序列被视为反向引用。如果n大于整个正则表达式中左括号的总数,则为错误\0表示字符,后面不能跟十进制数字。 web浏览器的附加功能中还提到了ClassEscape:

ClassEscape 21.2.2.19包括以下附加评估规则:

生产类Escape::DecimaleScape但仅当…的计算结果如下:

评估DecimalEscape以获得Escape值E。 断言:E是一个字符。 让他成为他的性格。 返回包含字符ch的单元素字符集。 我的主要问题是,我觉得DecimalEscape规则只会生成一个字符,如果它识别0,然后返回U+0000,否则它返回一个整数,但在Firefox中使用Javascript控制台进行测试时,我无法得到语法错误

以下是我发现的一些结果:

// This is the only one I understand:
/[\0]/.test("\x00") // true

// Now it gets strange
/[\1]/.test("\x01") // true
/[\2]/.test("\x02") // true
/[\3]/.test("\x03") // true
/[\4]/.test("\x04") // true
/[\5]/.test("\x05") // true
/[\6]/.test("\x06") // true
/[\7]/.test("\x07") // true
/[\8]/.test("\x08") // false
/[\9]/.test("\x09") // false
/[\10]/.test("\x0a") // false
/[\11]/.test("\x0b") // false

// This is not interpreted as `\1` and `0`
/[\10]/.test("0") // false

// Also, it's not a backreference
/((((((((((a))))))))))[\10]/.test("aa") // false
为什么它在7之前返回true,然后返回false?这不应该和八进制有关。我希望得到一些澄清

/[\0]/.test("\x00")
...
/[\7]/.test("\x07")
返回true,因为转义整数被视为以八进制表示法为基数8的数字

显然,当您使用8和9时,它就不可能在基8中使用了。在这种情况下,只需忽略反斜杠

/[\10]/.test("\x0a")
/[\11]/.test("\x0b")
返回false,因为\10基8给出8基10

将返回真值


此行为是浏览器兼容性附加功能的一部分。本节将添加到的生成规则。此规则定义了代码单位从0到255的八进制转义\0到\377。

谢谢,Firefox和Node.js似乎都将decimalEscape解释为八进制。它上升到/[\377]/.test\u00ff,但随后/[\400]/.test\u0100为false。就目前而言,这只是一个观察结果,您能否提供指向指定此行为的权威来源的链接?找到了:它是浏览器添加B.1.2的一部分,我编辑了您的答案以包含它。
/[\10]/.test("\x08")
/[\11]/.test("\x09")