2009-07-22 32 views
8

Tôi có một NET Regex trông tương tự như:Regex: Làm thế nào để có được một tên nhóm

(?<Type1>AAA)|(?<Type2>BBB) 

Tôi đang sử dụng Matches phương pháp chống lại một chuỗi mẫu ví dụ "AAABBBAAA" và sau đó lặp qua các kết quả phù hợp.

Mục tiêu của tôi là để tìm ra loại phù hợp, sử dụng các nhóm phù hợp regex, vì vậy cho điều này regex nó sẽ là:

  • Type1
  • Type2
  • Type1

Tôi couldn không tìm thấy bất kỳ phương pháp GetGroupName nào. Hãy giúp tôi.

Trả lời

7

Nếu bạn muốn truy xuất tên nhóm cụ thể, bạn có thể sử dụng phương thức Regex.GroupNameFromNumber.

//regular expression with a named group 
Regex regex = new Regex(@"(?<Type1>AAA)|(?<Type2>BBB)", RegexOptions.Compiled); 

//evaluate results of Regex and for each match 
foreach (Match m in regex.Matches("AAABBBAAA")) 
{ 
    //loop through all the groups in current match 
    for(int x = 1; x < m.Groups.Count; x ++) 
    { 
     //print the names wherever there is a succesful match 
     if(m.Group[x].Success) 
      Console.WriteLine(regex.GroupNameFromNumber(x)); 
    } 
} 

Ngoài ra, có một chỉ mục chuỗi trên GroupCollection. đối tượng được truy cập trên thuộc tính Match.Groups, điều này cho phép bạn truy cập một nhóm trong một kết quả phù hợp theo tên thay vì theo chỉ mục.

//regular expression with a named group 
Regex regex = new Regex(@"(?<Type1>AAA)|(?<Type2>BBB)", RegexOptions.Compiled); 

//evaluate results of Regex and for each match 
foreach (Match m in regex.Matches("AAABBBAAA")) 
{ 
    //print the value of the named group 
    if(m.Groups["Type1"].Success) 
     Console.WriteLine(m.Groups["Type1"].Value); 
    if(m.Groups["Type2"].Success) 
     Console.WriteLine(m.Groups["Type2"].Value); 
} 
17

Đây có phải là thứ bạn đang tìm kiếm không? Nó sử dụng Regex.GroupNameFromNumber, do đó bạn không cần phải biết tên nhóm bên ngoài chính regex.

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     Regex regex = new Regex("(?<Type1>AAA)|(?<Type2>BBB)"); 
     foreach (Match match in regex.Matches("AAABBBAAA")) 
     { 
      Console.WriteLine("Next match:"); 
      GroupCollection collection = match.Groups; 
      // Note that group 0 is always the whole match 
      for (int i = 1; i < collection.Count; i++) 
      { 
       Group group = collection[i]; 
       string name = regex.GroupNameFromNumber(i); 
       Console.WriteLine("{0}: {1} {2}", name, 
            group.Success, group.Value); 
      } 
     } 
    } 
} 
0

Hãy thử điều này:

 var regex = new Regex("(?<Type1>AAA)|(?<Type2>BBB)"); 
     var input = "AAABBBAAA"; 
     foreach (Match match in regex.Matches(input)) 
     { 
      Console.Write(match.Value); 
      Console.Write(": "); 
      for (int i = 1; i < match.Groups.Count; i++) 
      { 
       var group = match.Groups[i]; 
       if (group.Success) 
        Console.WriteLine(regex.GroupNameFromNumber(i)); 
      }  
     } 
Các vấn đề liên quan