Как получить имя захваченных групп в регулярном выражении C#?
есть ли способ получить имя захваченной группы В 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);
}
Я хочу получить такой результат:
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
5 ответов:
использовать GetGroupNames чтобы получить список групп в выражении, а затем перебирать их, используя имена в качестве ключей в коллекции групп.
например,
GroupCollection groups = regex.Match(line).Groups; foreach (string groupName in regex.GetGroupNames()) { Console.WriteLine( "Group: {0}, Value: {1}", groupName, groups[groupName].Value); }
самый чистый способ сделать это с помощью этого метода расширения:
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; } }
Как только этот метод расширения будет установлен, вы можете получить имена и значения следующим образом: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"];
вы должны использовать
GetGroupNames();
и код будет выглядеть примерно так: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); }
начиная с .NET 4.7, есть
Group.Name
свойства скачать.