【问题标题】:RegExp /\c/ in JavaScriptJavaScript 中的正则表达式 /\c/
【发布时间】:2018-02-09 04:24:19
【问题描述】:

RegExp /\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 的字母。
  • 嗯,但是c ControlLetter 没有opt 符号。
  • /everythink/ 之间的所有想法都可以打印......!为什么?
  • JS 引擎比正则表达式规范更宽松(除非我遗漏了规范的某些部分)。 /\c/ 匹配文字文本 \c,就像其他无效转义一样(/\x/.test('\\x')/\q/.test('\\q'))。
  • Annex B 定义了“更宽松”的规范。在 Annex B 规范中,/\x/ 是有效的语法,但 /\c/ 看起来是无效的。所以我写了这个问题。

标签: javascript


【解决方案1】:

我找到了。

\c\ AtomEscape 替代方案不匹配。这是正确的。所以\ 字母与ExtendedPatternCharacter 匹配,c 字母与ExtendedPatternCharacter 分别匹配。

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

【讨论】:

  • 这在当时可能是正确的,但今天 ExtendedPatternCharacter 不包含“\”,而是 ExtendedAtom 包含了显式替代项“\ [lookahead = c]”。不过效果是一样的。值得注意的是,这是特定于附件 B 扩展的,即使使用附件 B,当存在 'u'(unicode)标志时,会抑制到达此替代方案,而是会收到 SyntaxError。在某种程度上,u 标志的作用类似于“RegExp 的严格模式”。
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2023-03-09
  • 2019-04-29
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多