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

Ben*_*aum 19 javascript regex

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

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

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

Ber*_*rgi 9

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

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

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

  • 不,`RegularExpressionLiteral`基本上允许完全任意的字符(和`flags`只能由`IdentifierParts`组成).抛出无效标志字符的[RegExpInitialize](http://www.ecma-international.org/ecma-262/6.0/#sec-regexpinitialize). (2认同)

nha*_*tdh 7

RegExp中的八进制转义序列

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

/a\1b/.test("a\u0001b");
/a\11b/.test("a\tb");
Run Code Online (Sandbox Code Playgroud)

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

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

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

无与伦比的右括号]和非量程量词{}

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

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

类似于八进制转义序列,正则表达式(缺省语法ES5.1第15.10.1,或ES6的部分21.2.1)不允许{,},]是一个原子,如那些字符被从生产排除PatternCharacter.

通过Atom [U] :: PatternCharacter产生,ES6的附录B B.1.4节中的语法也被扩展为将非量程量化序列(与QuantifierPrefix的语法不匹配的序列)解释为文字串.

但是,扩展语法不允许无法匹配],因为PatternCharacterPatternCharacterNoBrace生成仍然不允许].