什么ECMAScript实现扩展了RegExp语法?

时间:2015-06-20 19:56:34

标签: javascript regex

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

  

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

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

2 个答案:

答案 0 :(得分:9)

是的,Mozilla的Gecko引擎确实支持sticky y flag,这不是ES5的一部分。它最终成为了ES6的一部分。

当引擎开始实施look-behind时,可以再次使用此功能(我希望他们在开始实验之前开始进行实验)。

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

答案 1 :(得分:7)

RegExp中的八进制转义序列

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

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

RegExp的默认语法(如Section 15.10.1 of ES5.1Section 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.1section 21.2.1 of ES6)的默认语法不允许{},{{1}成为 Atom ,因为这些字符被排除在 PatternCharacter 的制作之外。

Annex B section B.1.4 of ES6中的语法也被扩展为解释非范围量词序列(与 QuantifierPrefix 的语法不匹配的序列)作为文字字符串,通过 Atom [U] :: PatternCharacter 制作。

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