更新:2007 年 11 月
ECMAScript 与规范化正则表达式的行为在三个方面有所差异:
匹配表达式中指定字符类的方式不同。默认情况下,规范化正则表达式支持 Unicode 字符类别。而 ECMAScript 不支持 Unicode。
自身具有后向引用的正则表达式捕获类必须在每次捕获迭代时得到更新。
对八进制转义和后向引用间的多义性的处理方式不同。
![]() |
---|
默认情况下,正则表达式引擎使用规范匹配行为。当 Regex.Regex(String, RegexOptions) 构造函数或者 Regex.Match(String, String, RegexOptions)、Regex.Matches(String, String, RegexOptions) 和 Regex.Replace(String, String, String, RegexOptions) 之类的正则表达式匹配方法的 options 参数包含 RegexOptions.ECMAScript 标志时,将使用符合 ECMAScript 的行为。 |
下表总结了规范化和 ECMAScript 正则表达式在八进制与后向引用解释中的区别。
规范化正则表达式行为 |
ECMAScript 行为 |
---|---|
如果 \ 后跟 0,再后跟 0 到 2 个八进制数字,则解释为八进制。例如, \044 始终表示“$”。 |
行为相同。 |
如果 \ 后跟一个从 1 到 9 的数字,后面再没有任何其他十进制数字,则解释为后向引用。例如,\9 始终表示后向引用 9,即使捕获 9 不存在。如果捕获不存在,则正则表达式分析器将引发语法异常。 |
如果存在单个十进制数字捕获,则后向引用该数字。否则解释为文本。 |
如果 \ 后跟一个从 1 到 9 的数字,后面还有其他十进制数字,则将这些数字解释为十进制值。如果存在该捕获,则将该表达式解释为后向引用。 否则,将前导的八进制数字解释为不超过八进制值 377 的八进制数字,也就是说,仅考虑该值的后八位;将其余数字解释为文本。例如,如果表达式 \3000 中存在捕获 300,则解释为后向引用 300;如果捕获 300 不存在,则解释为后跟 0 的八进制数字 300。 |
如果 \ 后跟从 1 到 9 的数字,后面还有任何十进制数字,则通过将尽可能多的数字转换为可引用捕获的十进制值而解释为后向引用。如果任何数字都不能转换,则解释为使用其值不超过八进制值 377 的前导八进制数字的八进制数字;将其余数字解释为文本。 |