所以我在JavaScript中知道实现允许扩展正则表达式语法:
实现可以扩展21.2.1中定义的ECMAScript正则表达式语法,但它不能扩展下面定义的RegularExpressionBody和RegularExpressionFlags产品或这些产品使用的产品。
这种能力曾被使用过吗?是否有任何现有的JavaScript实现扩展了正则表达式语法?
答案 0 :(得分:9)
是的,Mozilla的Gecko引擎确实支持sticky y
flag,这不是ES5的一部分。它最终成为了ES6的一部分。
当引擎开始实施look-behind时,可以再次使用此功能(我希望他们在开始实验之前开始进行实验)。
这不是一个详尽的清单,只是我首先想到的。可能还有其他例子。
答案 1 :(得分:7)
该子句的广泛应用(也在ECMAScript 5.1规范第7.8.5节中提出)是为RegExp构造函数提供八进制转义序列。
/a\1b/.test("a\u0001b");
/a\11b/.test("a\tb");
RegExp的默认语法(如Section 15.10.1 of ES5.1或Section 21.2.1 of ES6中所述)不支持八进制转义序列,并且任何十进制转义序列的值大于捕获组的数量触发器的的SyntaxError 即可。但是,许多浏览器(甚至是旧版本)扩展了RegExp语法以支持八进制转义序列,并将上面两行代码评估为true
。
从ES6开始,Annex B(曾经是ES3到ES5.1规范中的信息性附件)被转换为规范附件,出于兼容性原因,要求 Web浏览器支持八进制转义序列(非Web浏览器主机可以选择坚持默认实现)。
虽然以前版本的ECMAScript确实解决了对八进制转义序列的支持,但它仅适用于Numeric和String文字。向后兼容的RegExp首次在Section B.1.4 of ES6中进行了描述,它更改了BMP模式的RegExp的语义和语法,以包括对八进制转义序列的支持,以及其他功能。
]
和非范围量词与{}
另一个常见的扩展(在Firefox 38,Chrome 43和IE9上测试)是放宽语法以允许无法匹配的右括号]
和不构成编号量词的序列并将其解释为字面值字符串。
/^][[]]$/.test("][]"); // Tokens: ^ ] [[] ] $
/^{56, 67}$/.test("{56, 67}"); // Extra space
与八进制转义序列类似,RegExp(section 15.10.1 of ES5.1或section 21.2.1 of ES6)的默认语法不允许{
,}
,{{1}成为 Atom ,因为这些字符被排除在 PatternCharacter 的制作之外。
Annex B section B.1.4 of ES6中的语法也被扩展为解释非范围量词序列(与 QuantifierPrefix 的语法不匹配的序列)作为文字字符串,通过 Atom [U] :: PatternCharacter 制作。
但是,扩展语法不允许无法匹配的结束]
,因为 PatternCharacter 和 PatternCharacterNoBrace 生产仍然不允许]
。