根据this reference,有两个转义序列\n
和\num
,其中n
是八进制数,num
是正整数。前者是转换为字符的转义值,后者是后引用。
这不是很模糊吗?正则表达式如何区分它们?什么时候决定使用一个而不是另一个?
答案 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