Как получить доступ к группам захвата именования в .NET Regex?

Мне сложно найти хороший ресурс, который объясняет, как использовать Named Capturing Groups в C #. Это код, который у меня есть до сих пор:

string page = Encoding.ASCII.GetString(bytePage); Regex qariRegex = new Regex("<a href=https://stackoverflow.com/questions/906493/how-do-i-access-named-capturing-groups-in-a-net-regex/\"(?.*?)\">(?.*?)"); MatchCollection mc = qariRegex.Matches(page); CaptureCollection cc = mc[0].Captures; MessageBox.Show(cc[0].ToString()); 

Однако это всегда показывает полную строку:

 Name of File 

Я экспериментировал с несколькими другими «методами», которые я нашел на разных сайтах, но я получаю тот же результат.

Как я могу получить доступ к именованным группам захвата, указанным в моем регулярном выражении?

Используйте групповой набор объекта Match, индексируя его с именем группы захвата, например

 foreach (Match m in mc){ MessageBox.Show(m.Groups["link"].Value); } 

Вы указываете именованную группу группы захвата, передавая ее индектору свойства Groups результирующего объекта Match .

Вот небольшой пример:

 using System; using System.Text.RegularExpressions; class Program { static void Main() { String sample = "hello-world-"; Regex regex = new Regex("-(?[^-]*)-"); Match match = regex.Match(sample); if (match.Success) { Console.WriteLine(match.Groups["test"].Value); } } } 

Следующий образец кода будет соответствовать шаблону даже в случае пробелов между ними. т.е.:

 Name of File 

так же как:

  Name of File  

Метод возвращает true или false, в зависимости от того, соответствует ли строка ввода htmlTd шаблону или нет. Если он совпадает, параметры out содержат ссылку и имя соответственно.

 ///  /// Assigns proper values to link and name, if the htmlId matches the pattern ///  /// true if success, false otherwise public static bool TryGetHrefDetails(string htmlTd, out string link, out string name) { link = null; name = null; string pattern = "\\s*[^\"]*)\"|(?\\S+))\\s*>(?.*)\\s*\\s*"; if (Regex.IsMatch(htmlTd, pattern)) { Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); link = r.Match(htmlTd).Result("${link}"); name = r.Match(htmlTd).Result("${name}"); return true; } else return false; } 

Я проверил это, и он работает правильно.

Кроме того, если у кого-то есть прецедент, где ему нужны имена групп, прежде чем выполнять поиск по объекту Regex, он может использовать:

 var regex = new Regex(pattern); // initialized somewhere // ... var groupNames = regex.GetGroupNames(); 
  • Регулярное выражение с переменным числом групп?
  • Регулярные выражения Java и знак доллара
  • Можно ли заменить несколько элементов в одном регулярном выражении в VIM или Perl?
  • Замена Java Regex с помощью группы захвата
  • Regex разделите строку, но сохраните разделители
  • Проверьте, соответствует ли строка регулярному выражению в сценарии Bash
  • Как использовать регулярное выражение java для соответствия строке
  • Разбиение строки Java на символ канала с помощью split ("|")
  • Что означает «ленивый» и «жадный» в контексте регулярных выражений?
  • Regex: Я хочу, чтобы это И было И что ... в любом порядке
  • Новые строки в sed на Mac OS X
  • Давайте будем гением компьютера.