RegExp /\c/ in JavaScript

6

正则表达式 /\c/ 并不会触发任何语法错误。

console.log(/\c/)

问题是为什么它不是语法错误。从语言规范来看,我猜测 PatternDisjunctionAlternativeTermAtom\ AtomEscapeCharacterEscapeIdentityEscape,然后它到达了SourceCharacter but not c,并且它不符合条件but not c
引用:

https://www.ecma-international.org/ecma-262/8.0/#sec-regular-expressions-patterns

我想知道我的想法是否正确。

我认为这被解释为空控制字符。\cX其中X是从A到Z的字母。 - elclanrs
哦,但是 c ControlLetter 没有 opt 符号。 - mysticatea
1
JS引擎对于正则表达式比规范更宽容(除非我漏掉了规范的某个部分)。/\c/匹配字面文本\c,就像其他无效转义一样(/\x/.test('\\x')/\q/.test('\\q'))。 - Ry-
1
附录B定义了“更宽松”的规范。在附录B规范中,/\x/是有效的语法,但/\c/看起来无效。因此我写下了这个问题。 - mysticatea
我认为不存在与\c匹配的替代方案。但是,如果在\c之后有一个字母,则它是c ControlLetter - mysticatea
显示剩余3条评论
1个回答

3

我找到了它。

\c 不匹配 \ AtomEscape 的替代项,这是正确的。因此,\ 字符与 ExtendedPatternCharacter 匹配,而 c 字符单独与 ExtendedPatternCharacter 匹配。

/^\x$/.test("x") //→ true
/^\c$/.test("c") //→ false
/^\c$/.test("\\c") //→ true

这在过去可能是正确的,但今天的ExtendedPatternCharacter不包括“\”,而是ExtendedAtom包括显式的替代“[lookahead=c]”。虽然效果相同,但值得注意的是,这仅适用于Annex B扩展,并且即使使用Annex B,在存在'u'(unicode)标志时,也会抑制到达此替代方案,而是会出现SyntaxError。在某种程度上,u标志就像RegExp的“严格模式”。 - Semicolon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接