我正在学习.NET 正则表达式。 众所周知,八进制转义码(例如\16)和\number 反向引用之间存在歧义。 https://msdn.microsoft.com/en-us/library/thwdfzxy.aspx
我的问题是:
当正则表达式模式中未定义具有该数字的组时,\19
或 \288
等正则表达式会匹配什么?
它既不是有效的组号,也不是有效的八进制代码。
但它是一个有效的正则表达式(甚至 \14848486
也是有效的) - Regex 构造函数不会抛出 ArgumentException,但我找不到任何与此类转义序列匹配的输入字符串。
我只是好奇如何解释一个表达式。
最佳答案
当解析一个模式有多种可能性时,就会出现歧义。比如说,在具有 10 个捕获组的 (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\10
模式中,我们可以说存在歧义,因为 1
和 10
都可以引用现有组,但 .NET 正则表达式引擎将这种歧义解析为最大可能的值,并且此正则表达式 won't match 12345678901
, but will match 12345678900
。为了消除歧义,您需要使用 \k<ID>
反向引用。 (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\k<1>0
将匹配 123456789010
,但不匹配 123456789000
。
\14848486
模式匹配八进制 14 字符,然后匹配 848486
序列,因为这里没有歧义。
\18848486
模式将匹配八进制 1 字符,然后匹配 8848486
字符序列。请参阅 this C# demo:
var s = Regex.Match("\u00018848486", @"\18848486");
if (s.Success) Console.WriteLine(s.Value); // => 8848486
我还建议使用 Ultrapico Expresso(无隶属关系)来调试 .NET 正则表达式,请参阅屏幕截图:
对于\19
和\288
:
此外,当您使用对缺少的组的反向引用时(如 \k<1>8848486
中所示),您将使用 will get a System.ArgumentException: parsing '\k<1>8848486' - Reference to undefined group number N
exception 。当您在 8
之后有 9
或 \
时(如 \8848486
中所示),您将得到 System.ArgumentException: parsing '\8848486' - Unrecognized escape sequence N
exception 。
关于.net - .NET 正则表达式 "\19abc"匹配什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600856/