¿Cómo accedo a los grupos de captura nombrados en .NET Regex?

Me está costando encontrar un buen recurso que explique cómo usar grupos de captura con nombre en C #. Este es el código que tengo hasta ahora:

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

Sin embargo, esto siempre muestra la línea completa:

 Name of File 

He experimentado con varios otros “métodos” que he encontrado en varios sitios web, pero sigo obteniendo el mismo resultado.

¿Cómo puedo acceder a los grupos de captura nombrados que están especificados en mi expresión regular?

Use la colección de grupos del objeto Match, indicándolo con el nombre del grupo de captura, por ej.

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

Especifique la cadena del grupo de captura con nombre pasándola al indexador de la propiedad Groups de un objeto Match resultante.

Aquí hay un pequeño ejemplo:

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

El siguiente ejemplo de código coincidirá con el patrón incluso en el caso de caracteres espaciales intermedios. es decir:

 Name of File 

tanto como:

  Name of File  

El método devuelve verdadero o falso, dependiendo de si la cadena htmlTd de entrada coincide con el patrón o no. Si coincide, los param contienen el enlace y el nombre, respectivamente.

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

Lo he probado y funciona correctamente.

Además, si alguien tiene un caso de uso donde necesita nombres de grupo antes de ejecutar la búsqueda en el objeto Regex, puede usar:

 var regex = new Regex(pattern); // initialized somewhere // ... var groupNames = regex.GetGroupNames();