哪些 ECMAScript 实现扩展了 RegExp 语法
What ECMAScript implementations extend the RegExp syntax?
所以我知道在 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的生产仍然不允许]
。
- 铬:“;未捕获的语法错误:意外的标记:"
- jQuery语法添加了var
- RegExp:匹配Javascript中除regex值之外的所有内容
- Javascript未捕获语法错误意外的标识符错误
- 为什么忽略了eval()代码中的语法错误
- 难以访问的JS环境中的语法错误
- 如何告诉MathJax对下标使用替代语法
- Javascript语法向设置发出sessionStorage值
- JavaScript正则表达式文本与RegExp对象
- 使用RegExp查找url中的字符
- 未捕获的语法错误:意外的标记{
- 使用$scope方法时的ControllerAs语法
- "未捕获的语法错误:意外的标记}"
- javascript自执行函数-不同的语法
- 函数的Javascript语法
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- Regexp匹配十六进制颜色语法(和缩写形式)
- JavaScript RegExp语法问题
- JavaScript和正则表达式:字面语法Vs. RegExp对象
- 哪些 ECMAScript 实现扩展了 RegExp 语法