我指的是中定义的ECMAScript正则表达式语法https://tc39.es/ecma262/#sec-regexp正则表达式对象。
我通过几个在线来源检查了以下模式在正则表达式中的匹配情况。
Pattern: /[[]]/
他们都包括
[ -> Match any character in the character set
[ -> Matches a `[` character
]
] -> Matches a `]` character
我知道字符集是如何匹配的,但我不明白为什么最后一个右括号(]
(是匹配的。根据语法定义的ECMAScript规范,PatternCharacter
只能是不是SyntaxCharacter
的SourceCharacter
,这不是正则表达式中的语法错误吗(https://tc39.es/ecma262/#prod-PatternCharacter(?闭合括号(]
(是一个SyntaxCharacter
。
PatternCharacter ::
SourceCharacter but not SyntaxCharacter
在附件B Web浏览器的附加ECMAScript功能中,同一规范的B.1.2正则表达式模式一节中,它说:
22.2.1的语法修改和扩展如下。这些变化引入了歧义,语法产物的顺序和上下文信息打破了歧义。当使用以下语法进行解析时,只有在以前的生产备选方案不匹配的情况下,才会考虑每个备选方案。
在那里,我们发现项可以是扩展原子,它又可以是扩展模式特征
SourceCharacter,但不是
^ $ . * + ? ( ) [ |
之一
所以这里允许]
。
本规范的附件B介绍了:
当ECMAScript主机是web浏览器时,需要本附件中定义的ECMASscript语言语法和语义。如果ECMAScript主机不是web浏览器,则本附件的内容是规范性的,但是可选的。
有趣的是;额外的";NodeJS中也提供了行为,尽管根据本规范它不必这样做。