Los grupos en expresiones regulares son un concepto muy importante y son nuestro puente hacia aplicaciones avanzadas de expresiones regulares.
El concepto de grupo.
El resultado de una coincidencia de expresión regular se puede dividir en varias partes. Este es el propósito del grupo. Una vez que pueda usar grupos de manera flexible, descubrirá que Regex es realmente conveniente y poderoso.
Primero tomemos un ejemplo:
public static void Main()
{
cadena s = "2005-2-21";
Regex reg = new Regex(@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .Compilado);
Coincidencia de coincidencia = reg.Match(s);
int año = int.Parse(match.Groups["y"].Value);
int mes = int.Parse(match.Groups["m"].Value);
int día = int .Parse(match.Groups["d"].Value);
FechaHora hora = nueva FechaHora(año,mes,día);
Consola.WriteLine(hora);
Consola.ReadLine();
}
El ejemplo anterior analiza una cadena a través de grupos y la convierte en una instancia de DateTime. Por supuesto, esta función se puede implementar fácilmente usando el método DateTime.Parse.
En este ejemplo, uso (?<nombre>) para dividir los resultados de una coincidencia en tres grupos "y", "m" y "d" que representan el año, mes y día respectivamente.
Ahora que tenemos el concepto de grupos, veamos cómo agruparlos. Es muy simple. Además del método anterior, podemos definir un grupo con un par de corchetes. Por ejemplo, el ejemplo anterior se puede cambiar a:
vacío estático público principal ()
{
cadena s = "2005-2-21";
Regex reg = new Regex(@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
Coincidencia de coincidencia = reg.Match(s);
int año = int.Parse(match.Groups[1].Value);
int mes = int.Parse(match.Groups[2].Value);
int día = int .Parse(match.Groups[3].Value);
FechaHora hora = nueva FechaHora(año,mes,día);
Consola.WriteLine(hora);
Consola.ReadLine();
}
Como se puede ver en el ejemplo anterior, el grupo incluido en el primer par de corchetes se numera automáticamente 1, y los siguientes corchetes se numeran 2, 3...
public static void Main()
{
cadena s = "2005-2-21";
Regex reg = new Regex(@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .Compilado);
Coincidencia de coincidencia = reg.Match(s);
int año = int.Parse(match.Groups[2].Value);
int mes = int.Parse(match.Groups[1].Value);
int día = int .Parse(match.Groups[3].Value);
FechaHora hora = nueva FechaHora(año,mes,día);
Consola.WriteLine(hora);
Consola.ReadLine();
}
Mirando nuevamente el ejemplo anterior, usamos (?<número>) para numerar manualmente el grupo de cada par de corchetes (tenga en cuenta que no definí las posiciones de 1 y 2 de izquierda a derecha
en los tres ejemplos anteriores
).Conocemos las tres formas de definir Grupo para Regex y las formas correspondientes de hacer referencia a los resultados de coincidencia de grupos.
Luego, con respecto a la definición de grupos, tenga en cuenta dos puntos más:
1. Debido a que los corchetes se usan para definir grupos, si desea hacer coincidir "(" y ")", use "(" y ")" (sobre todos especial Para la definición de caracteres, consulte la documentación de ayuda de expresiones regulares correspondientes).
2. Si se usa la opción ExplicitCapture al definir Regex, el segundo ejemplo no tendrá éxito, porque esta opción requiere un grupo definido explícitamente con un número o nombre para capturar y guardar los resultados si no define la opción ExplicitCapture, y a veces. Si define una expresión similar a (A|B) y no desea capturar el resultado de esta (A|B), puede utilizar la sintaxis de "grupo sin captura", que se define como ( ?:) Método, para (A|B), puede definirlo así para lograr el propósito de no capturarlo y guardarlo en la colección Grupo - (?:A|B).