regular pattern online one matches creator c# .net regex

c# - pattern - ¿Cómo accedo a los grupos de captura nombrados en un.NET Regex?



regular expression creator online (4)

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

Me cuesta mucho encontrar un buen recurso que explique cómo usar los 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("<td><a href=/"(?<link>.*?)/">(?<name>.*?)</a></td>"); MatchCollection mc = qariRegex.Matches(page); CaptureCollection cc = mc[0].Captures; MessageBox.Show(cc[0].ToString());

Sin embargo esto siempre muestra la línea completa:

<td><a href="/path/to/file">Name of File</a></td>

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?


El siguiente ejemplo de código coincidirá con el patrón incluso en el caso de que haya caracteres de espacio en el medio. es decir:

<td><a href=''/path/to/file''>Name of File</a></td>

tanto como:

<td> <a href=''/path/to/file'' >Name of File</a> </td>

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 parámetros de salida contienen el enlace y el nombre respectivamente.

/// <summary> /// Assigns proper values to link and name, if the htmlId matches the pattern /// </summary> /// <returns>true if success, false otherwise</returns> public static bool TryGetHrefDetails(string htmlTd, out string link, out string name) { link = null; name = null; string pattern = "<td>//s*<a//s*href//s*=//s*(?:/"(?<link>[^/"]*)/"|(?<link>//S+))//s*>(?<name>.*)//s*</a>//s*</td>"; 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; }

He probado esto y funciona correctamente.


Usted especifica la cadena de grupo de captura nombrada pasándola al indizador 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("-(?<test>[^-]*)-"); Match match = regex.Match(sample); if (match.Success) { Console.WriteLine(match.Groups["test"].Value); } } }


Utilice la colección de grupo del objeto Match, indexándolo con el nombre del grupo de captura, por ejemplo,

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