模糊的正则表达式转义\ num

时间:2010-11-25 08:47:51

标签: c# regex

根据this reference,有两个转义序列\n\num,其中n是八进制数,num是正整数。前者是转换为字符的转义值,后者是后引用。

这不是很模糊吗?正则表达式如何区分它们?什么时候决定使用一个而不是另一个?

4 个答案:

答案 0 :(得分:4)

消除歧义的规则在http://msdn.microsoft.com/en-us/library/thwdfzxy.aspx

中有所描述

请注意使用相同表示法的八进制转义码(例如\16)和\number反向引用之间的歧义。这种含糊不清的解决方法如下:

  • 表达式\1\9始终被解释为反向引用,而不是八进制代码。

  • 如果多位数表达式的第一个数字是8或9(例如\80\91),则表达式将被解释为文字。

  • 如果存在与该数字相对应的反向引用,则\10及更高版本的表达式将被视为反向引用;否则,它们被解释为八进制代码。

  • 如果正则表达式包含对未定义组编号的反向引用,则会发生解析错误,并且正则表达式引擎会抛出ArgumentException

答案 1 :(得分:2)

是的,这是不明确的......但如果你查看MSDN文档here,它会解释它是如何解决的:

  

请注意八进制转义码(例如\ 16)和使用相同表示法的\ number反向引用之间的歧义。这种含糊不清的解决方法如下:

     

表达式\ 1到\ 9始终被解释为反向引用,而不是八进制代码。

     

如果多位数表达式的第一个数字是8或9(例如\ 80或\ 91),表达式将被解释为文字。

     

如果存在与该数字相对应的反向引用,则来自\ 10和更高版本的表达式被视为反向引用;否则,它们被解释为八进制代码。

     

如果正则表达式包含对未定义组编号的反向引用,则会发生解析错误,并且正则表达式引擎会抛出ArgumentException。

对于这两个元素具有相同的语法真的是一个愚蠢的选择,因为如果你不遵循这个精确引用如何解决歧义,你就会产生奇怪的错误。

答案 2 :(得分:1)

是的,它含糊不清。我会冒昧地解决歧义,转而将其解释为反向引用。如果真正需要八进制数,则始终可以使用0作为前缀。

答案 3 :(得分:0)

我认为它会尝试匹配反向引用,如果失败,则尝试进行八进制数匹配。

http://msdn.microsoft.com/en-us/library/1400241x%28VS.85%29.aspx