2009-09-04 2 views
83

Gibt es eine Möglichkeit, den Namen einer erfassten Gruppe in C# zu erhalten?Wie erhalte ich den Namen erfasster Gruppen in einem C# Regex?

string line = "No.123456789 04/09/2009 999"; 
Regex regex = new Regex(@"(?<number>[\d]{9}) (?<date>[\d]{2}/[\d]{2}/[\d]{4}) (?<code>.*)"); 

GroupCollection groups = regex.Match(line).Groups; 

foreach (Group group in groups) 
{ 
    Console.WriteLine("Group: {0}, Value: {1}", ???, group.Value); 
} 

Ich möchte dieses Ergebnis erhalten:

 
Group: [I don´t know what should go here], Value: 123456789 04/09/2009 999 
Group: number, Value: 123456789 
Group: date, Value: 04/09/2009 
Group: code, Value: 999 

Antwort

110

Verwenden GetGroupNames die Liste der Gruppen in einem Ausdruck zu bekommen und dann über jene laufen, die Namen als Schlüssel in die Sammelgruppen mit.

Zum Beispiel

GroupCollection groups = regex.Match(line).Groups; 

foreach (string groupName in regex.GetGroupNames()) 
{ 
    Console.WriteLine(
     "Group: {0}, Value: {1}", 
     groupName, 
     groups[groupName].Value); 
} 
+8

Vielen Dank! Genau das, was ich wollte. Ich hätte nie gedacht, dass dies im Regex-Objekt wäre :( –

5

sollten Sie GetGroupNames(); verwenden und der Code wird wie folgt aussehen:

string line = "No.123456789 04/09/2009 999"; 
    Regex regex = 
     new Regex(@"(?<number>[\d]{9}) (?<date>[\d]{2}/[\d]{2}/[\d]{4}) (?<code>.*)"); 

    GroupCollection groups = regex.Match(line).Groups; 

    var grpNames = regex.GetGroupNames(); 

    foreach (var grpName in grpNames) 
    { 
     Console.WriteLine("Group: {0}, Value: {1}", grpName, groups[grpName].Value); 
    } 
+0

+1 Danke Eran. –

18

Der sauberste Weg, dies zu tun, ist durch diese Erweiterung Methode:

public static class MyExtensionMethods 
{ 
    public static Dictionary<string, string> MatchNamedCaptures(this Regex regex, string input) 
    { 
     var namedCaptureDictionary = new Dictionary<string, string>(); 
     GroupCollection groups = regex.Match(input).Groups; 
     string [] groupNames = regex.GetGroupNames(); 
     foreach (string groupName in groupNames) 
      if (groups[groupName].Captures.Count > 0) 
       namedCaptureDictionary.Add(groupName,groups[groupName].Value); 
     return namedCaptureDictionary; 
    } 
} 


Sobald diese Erweiterungsmethode i s vorhanden ist, können Sie Namen und Werte wie diese:

var regex = new Regex(@"(?<year>[\d]+)\|(?<month>[\d]+)\|(?<day>[\d]+)"); 
    var namedCaptures = regex.MatchNamedCaptures(wikiDate); 

    string s = ""; 
    foreach (var item in namedCaptures) 
    { 
     s += item.Key + ": " + item.Value + "\r\n"; 
    } 

    s += namedCaptures["year"]; 
    s += namedCaptures["month"]; 
    s += namedCaptures["day"]; 
3

Seit 4.7, .NET ist es Group.Name Eigenschaft available.

Verwandte Themen