哪些 ECMAScript 实现扩展了 RegExp 语法

What ECMAScript implementations extend the RegExp syntax?

本文关键字:RegExp 语法 扩展 ECMAScript 实现 哪些      更新时间:2023-09-26

所以我知道在 JavaScript 中允许实现扩展正则表达式语法:

实现可以扩展 21.2.1 中定义的 ECMAScript 正则表达式语法,但不得扩展下面定义的 RegularExpressionBody 和 RegularExpressionFlags 产品或这些产品使用的产品。

这种能力曾经使用过吗?是否有任何现有的JavaScript实现扩展了正则表达式语法?

是的,Mozilla的Gecko引擎确实支持粘性y标志,这不是ES5的一部分。它最终成为ES6的一部分。

当引擎开始实现后视时,这种能力可能会再次被利用(我希望他们在它被指定之前开始试验)。

这不是一个详尽的清单,只是我首先想到的。可能还有其他例子。

则表达式中的八进制转义序列

该子句的一个广泛应用(在 ECMAScript 5.1 规范第 7.8.5 节中也有介绍)是为 RegExp 构造函数提供八进制转义序列。

/a'1b/.test("a'u0001b");
/a'11b/.test("a'tb");

RegExp 的默认语法(如 ES5.1 的第 15.10.1 节或 ES6 的第 21.2.1 节中所述)不支持八进制转义序列,任何值大于捕获组数的十进制转义序列都会触发 SyntaxError。但是,许多浏览器(甚至是旧版本)扩展了 RegExp 语法以支持八进制转义序列,并计算上面的 2 行代码以true

从 ES6 开始,附录 B 曾经是 ES3 到 ES5.1 规范中的信息性附件,现在变成了规范性附件,出于兼容性原因,它要求 Web 浏览器支持八进制转义序列(非 Web 浏览器主机可以选择坚持默认实现)。

虽然以前版本的 ECMAScript 确实解决了对八进制转义序列的支持,但它仅适用于数字和字符串文字。向后兼容的RegExp在ES6的B.1.4节中首次进行了描述,该节更改了BMP模式的RegExp的语义和语法,以包括对八进制转义序列的支持以及其他功能。

不匹配的右括号]和带{}的非范围量词

另一个常见的扩展(如在 Firefox 38、Chrome 43 和 IE9 上测试的那样)是放宽语法,以允许不匹配的右括号]和不构成编号量词的序列,并将它们解释为文字字符串。

/^][[]]$/.test("][]"); // Tokens: ^  ]  [[]  ]  $
/^{56, 67}$/.test("{56, 67}"); // Extra space

与八进制转义序列类似,RegExp的默认语法(ES5.1的第15.10.1节或ES6的第21.2.1节)不允许{}]原子,因为这些字符被排除在PatternCharacter的生产之外。

ES6 附录 B 第 B.1.4 节中的语法也扩展为通过 Atom[U] :: PatternCharacter 生产将非范围量词序列(与量词前缀的语法不匹配的序列)解释为文字字符串。

然而,扩展语法不允许不匹配的结束],因为PatternCharacter和PatternCharacterNoBrace的生产仍然不允许]