.NET Regex类的运算符优先级在哪里可以找到文档?

5

.NET Regex 类的运算符优先级顺序在哪里有记录?

我看到了this, 但那是针对JScript的。

此外,似乎这不受RegexOptions.ECMAScript 的影响,但确认会很有帮助。


1
优先级与 JScript 链接中的相同:一元运算符最紧密地绑定,然后是连接,然后是交替。括号按您的预期工作。 - porges
@zerkms,我正在编写表达式,想知道何时需要使用括号。Porges,我希望是这样,但我想看到它的文档记录。如果没有,我会提交一个Connect bug。 - Matthew Flaschen
1
@zerkms,我不确定你所说的“操作优先级”是什么意思。然而,非捕获组肯定可以用来改变整体优先级。例如,假设锚点比选择更强,则在整个表达式中使用非捕获组来包含选择是有意义的。^(?:this|that)$ - Matthew Flaschen
1
@zerkms,不行。请查看Ideone - Matthew Flaschen
@Matthew Flaschen:是的,我的错。但无论如何,在这种情况下,括号都是表达式的必需部分,因为这是您分组两个子字符串的方式。这与优先级无关。 - zerkms
显示剩余7条评论
3个回答

2

这个问题很久以前就被提出了,但没有得到答复。

.Net正则表达式运算符优先级在“正则表达式语法”页面的底部1中定义。


那个文档链接实际上是关于VS 2010的JScript引擎,而不是.NET引擎。我已经在我的回答中放置了最新的链接和表格的副本。 - Bill Menees

1

我认为真正的答案并不像你想象的那么简单。简短(且不完整)的答案只是“所有表达式都从左到右进行评估”...

要了解详细答案,请点击这里。

http://msdn.microsoft.com/en-us/library/e347654k.aspx

.NET Framework 正则表达式引擎是一个回溯正则表达式匹配器,它包含了传统的非确定有限状态自动机(NFA)引擎... 传统的 NFA 引擎执行模式匹配,其处理顺序由正则表达式模式驱动。当它处理特定的语言元素时,引擎使用贪婪匹配;也就是说,它尽可能地匹配输入字符串的大部分内容。但是,它还会在成功匹配子表达式后保存其状态。如果匹配最终失败,引擎可以返回到保存的状态,以便尝试其他匹配。

编辑:忘记回答您问题的第二部分了。

关于 RegexOptions.ECMAScript,您可以参考这些文档:

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

ECMAScript和规范正则表达式的行为在三个方面有所不同:字符类语法、自引用捕获组和八进制与反向引用解释。看起来"order"没有受到影响,但可能存在其他问题。文档很好地说明了这些差异。

1
处理顺序与运算符优先级顺序不同。处理顺序描述了在解析后如何执行(对于每个输入)。运算符优先级是解析的关键部分。我同意“所有表达式从左到右评估”不是完整的答案。如果是这样,^\d将是字符串开头的斜杠(^\),后跟一个字面上的 d - Matthew Flaschen

1
为了澄清Donald Rich的回答, 微软并没有提供.NET正则表达式引擎的明确优先顺序文档。然而,他们确实记录了旧版Visual Studio 2010 JScript引擎的优先顺序,这似乎与.NET的行为相匹配。如果微软的文档消失,我在下面复制了它。
正则表达式语法 > 优先顺序
一个正则表达式的评估类似于算术表达式;也就是说,它从左到右进行评估,并遵循一种优先顺序。
下表包含了正则表达式运算符的优先顺序,从高到低。
运算符或操作符 描述 \ 转义 (), (?:), (?=), [] 括号和方括号 *, +, ?, {n}, {n,}, {n,m} 量词 ^, $, \anymetacharacter 锚点和序列 | 选择
字符比选择运算符具有更高的优先级,例如允许 "m|food" 匹配 "m" 或 "food"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接