How do I get the name of captured groups in a C# Regex?

Viewed 70025

Is there a way to get the name of a captured group in C#?

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);
}

I want to get this result:

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
6 Answers

To update the existing extension method answer by @whitneyland with one that can handle multiple matches:

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;
    }

Usage:

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