所以我在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");
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的语法不匹配的序列)解释为文字串.
但是,扩展语法不允许无法匹配],因为PatternCharacter和PatternCharacterNoBrace生成仍然不允许].
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |