名称不视为编号组的正则表达式组

时间:2018-08-19 22:15:17

标签: c# regex

谁能解释正则表达式的命名组有时像未命名组一样被编号而有时却没有编号的行为。

例如:

var text = "The big brown fox jumped over the lazy dog.";

var pat1 = @"(?<sentence>(\w+(\s+|\.))+)";
var re1 = new Regex(pat1);
var m1 = re1.Match(text);
Console.WriteLine($"m1.Groups[\"sentence\"].Value: {m1.Groups["sentence"].Value}");
Console.WriteLine($"         m1.Groups[0].Value: {m1.Groups[0].Value}");
Console.WriteLine($"         m1.Groups[1].Value: {m1.Groups[1].Value}");
Console.WriteLine($"         m1.Groups[2].Value: {m1.Groups[2].Value}");
Console.WriteLine($"         m1.Groups[3].Value: {m1.Groups[3].Value}");
Console.WriteLine($"         m1.Groups[4].Value: {m1.Groups[4].Value}");
Console.WriteLine();

// pat2 is the same as pat1 but without the name for the first group
var pat2 = @"((\w+(\s+|\.))+)";
var re2 = new Regex(pat2);
var m2 = re2.Match(text);
Console.WriteLine($"m2.Groups[0].Value: {m2.Groups[0].Value}");
Console.WriteLine($"m2.Groups[1].Value: {m2.Groups[1].Value}");
Console.WriteLine($"m2.Groups[2].Value: {m2.Groups[2].Value}");
Console.WriteLine($"m2.Groups[3].Value: {m2.Groups[3].Value}");
Console.WriteLine($"m2.Groups[4].Value: {m2.Groups[4].Value}");
Console.WriteLine();

var pat3 = @"The\s+(?<word>\w+)\s+brown.*$";
var re3 = new Regex(pat3);
var m3 = re3.Match(text);
Console.WriteLine($"m3.Groups[\"word\"].Value: {m3.Groups["word"].Value}");
Console.WriteLine($"     m3.Groups[0].Value: {m3.Groups[0].Value}");
Console.WriteLine($"     m3.Groups[1].Value: {m3.Groups[1].Value}");
Console.WriteLine($"     m3.Groups[2].Value: {m3.Groups[2].Value}");
Console.WriteLine();

具有以下结果:

m1.Groups["sentence"].Value: The big brown fox jumped over the lazy dog.
         m1.Groups[0].Value: The big brown fox jumped over the lazy dog.
         m1.Groups[1].Value: dog.
         m1.Groups[2].Value: .
         m1.Groups[3].Value: The big brown fox jumped over the lazy dog.
         m1.Groups[4].Value: 

m2.Groups[0].Value: The big brown fox jumped over the lazy dog.
m2.Groups[1].Value: The big brown fox jumped over the lazy dog.
m2.Groups[2].Value: dog.
m2.Groups[3].Value: .
m2.Groups[4].Value: 

m3.Groups["word"].Value: big
     m3.Groups[0].Value: The big brown fox jumped over the lazy dog.
     m3.Groups[1].Value: big
     m3.Groups[2].Value: 

我希望得到 m1.Groups [1] .Value == m2.Groups [1] .Value 的结果,所以对 m1.Groups [2] ] .Value m1.Groups [3] .Value 我希望它们与 m2.Groups [2] .Value m2 .Groups [3] .Value

正则表达式求值器的行为类似于如果该组被命名(如其在 pat1 中被命名为“句子”),则它不参与在 m1中的计数。 Groups [1] .Value ,然后RE评估器会生成意外的 m1.Groups [3] .Value ,它与 m1.Groups [0] .Value < / strong>或我期望的 m1.Groups [1] .Value

现在,如果命名组不参与组计数,则第三个模式pat3(具有命名组:“ word”)的行为与我预期的一样。是否命名组,第一组括号房屋组1,第二组括号房屋组2,等等。

我找不到任何解释这种现象的文献。您的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

@WiktorStribiżew感谢您的参考。

答案是:首先捕获未命名个组,然后是命名个组。

因此, m1.Groups [1] .Value 捕获第一个未命名括号组(\w+(\s+|\.)) m1.Groups [2]。 Value 捕获第二个未命名括号组(\s+|\.),最后捕获 m1.Group [3]。Value捕获第一个命名 strong>括号组(?<sentence>(\w+(\s+|\.))+)