为什么运行.net Regex与ECMAScript风格支持A



我有一个.NetStandard2.1C#应用程序,需要在ECMAScript风味中运行Regex

根据MSDN文档,我可以使用RegexOptions.ECMAScript:

为表达式启用符合ecmascript的行为。

我知道ECMAScript不支持A锚(根据链接,当我尝试使用ECMAScript选项的Regex101时)。但是。net似乎支持它。例子:

Regex emcaRegex = new Regex(@"Ad{3}", RegexOptions.ECMAScript);
var matches =  emcaRegex.Matches("901-333-");
Console.WriteLine($"number of matches: {matches.Count}"); // number of matches: 1
Console.WriteLine($"The match: {matches[0]}"); // The match: 901

我期望得到不匹配,我错过了什么?

您需要在"ECMAScript匹配行为"中进一步查找答案。文章。

这个选项没有重新定义。net特定的锚的含义,它们仍然被支持。

ECMAScript和规范正则表达式的行为在三个方面有所不同:字符类语法、自引用捕获组以及八进制和反向引用解释。

字符类语法。因为规范正则表达式支持Unicode,而ECMAScript不支持,所以ECMAScript中的字符类语法更有限,而且一些字符类语言元素具有不同的含义。例如,ECMAScript不支持语言元素,如Unicode类别或块元素pP。类似地,匹配单词字符的w元素在使用ECMAScript时等同于[a-zA-Z_0-9]字符类,在使用规范行为时等同于[p{Ll}p{Lu}p{Lt}p{Lo}p{Nd}p{Pc}p{Lm}]。有关更多信息,请参见字符类。

自引用捕获组。对自身有反向引用的正则表达式捕获类必须在每次捕获迭代时更新。

解决八进制转义和反向引用之间的歧义。

正则表达式 规范行为 ECMAScript行为
后面跟着0到2个八进制数字 解释为八进制。例如,44总是被解释为八进制值,表示"$"。 相同行为。
后面跟着一个1到9的数字,后面没有额外的十进制数字, 解释为反向引用。例如,9总是表示反向引用9,即使第九个捕获组不存在。如果捕获组不存在,正则表达式解析器将抛出ArgumentException。 如果存在单个十进制数字捕获组,则反向引用该数字。否则,将值解释为文字。
后面跟着1到9的数字,后面跟着另外的十进制数字 将这些数字解释为十进制值。如果存在该捕获组,则将表达式解释为反向引用。否则,解释直到八进制377的前导八进制数字;也就是说,只考虑值的低8位。将其余数字解释为字面量。例如,在表达式3000中,如果捕获组300存在,则解释为反向引用300;如果捕获组300不存在,则解释为八进制300后加0。 通过将尽可能多的数字转换为可以引用捕获的十进制值来解释为反向引用。如果没有数字可以转换,使用八进制前导数字377解释为八进制;