111 Stimmen

Wie erhalte ich den Namen der erfassten Gruppen in einer C# Regex?

Gibt es eine Möglichkeit, den Namen einer erfassten Gruppe in C# zu erhalten?

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

141voto

Jeff Yates Punkte 59874

Verwenden Sie GetGroupNames um die Liste der Gruppen in einem Ausdruck zu erhalten und dann über diese zu iterieren, wobei die Namen als Schlüssel in der Gruppensammlung verwendet werden.

Zum Beispiel,

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

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

28voto

whitneyland Punkte 10275

Die sauberste Art, dies zu tun, ist die Verwendung dieser Erweiterungsmethode:

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 eingerichtet ist, können Sie Namen und Werte wie folgt abrufen:

    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"];

14voto

Jozef Benikovský Punkte 1081

Seit .NET 4.7 gibt es Group.Name Eigenschaft verfügbar .

8voto

Eran Betzalel Punkte 4059

Sie sollten Folgendes verwenden GetGroupNames(); und der Code wird in etwa so 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);
    }

2voto

Kinetic Punkte 592

Aktualisierung der bestehenden Erweiterungsmethode answer by @whitneyland mit einer Methode, die mehrere Treffer verarbeiten kann:

public static List<Dictionary<string, string>> MatchNamedCaptures(this Regex regex, string input)
    {
        var namedCaptureList = new List<Dictionary<string, string>>();
        var match = regex.Match(input);

        do
        {
            Dictionary<string, string> namedCaptureDictionary = new Dictionary<string, string>();
            GroupCollection groups = match.Groups;

            string[] groupNames = regex.GetGroupNames();
            foreach (string groupName in groupNames)
            {
                if (groups[groupName].Captures.Count > 0)
                    namedCaptureDictionary.Add(groupName, groups[groupName].Value);
            }

            namedCaptureList.Add(namedCaptureDictionary);
            match = match.NextMatch();
        }
        while (match!=null && match.Success);

        return namedCaptureList;
    }

Verwendung:

  Regex pickoutInfo = new Regex(@"(?<key>[^=;,]+)=(?<val>[^;,]+(,\d+)?)", RegexOptions.ExplicitCapture);

  var matches = pickoutInfo.MatchNamedCaptures(_context.Database.GetConnectionString());

  string server = matches.Single( a => a["key"]=="Server")["val"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X