Les groupes dans les expressions régulières sont un concept très important et ils constituent notre pont vers les applications avancées d’expressions régulières.
Le concept de groupe.
Un résultat de correspondance d'expression régulière peut être divisé en plusieurs parties. C'est le but du groupe. Une fois que vous pourrez utiliser les groupes de manière flexible, vous constaterez que Regex est vraiment pratique et puissant.
Prenons d'abord un exemple :
public static void Main()
{
chaîne s = "2005-2-21" ;
Regex reg = new Regex (@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .Compilé);
Match match = reg.Match(s);
int année = int.Parse(match.Groups["y"].Value);
int mois = int.Parse(match.Groups["m"].Value);
int jour = int .Parse(match.Groups["d"].Value);
DateTime heure = new DateTime (année, mois, jour);
Console.WriteLine(heure);
Console.ReadLine();
}
L'exemple ci-dessus analyse une chaîne à travers des groupes et la convertit en une instance DateTime. Bien entendu, cette fonction peut être facilement implémentée à l'aide de la méthode DateTime.Parse.
Dans cet exemple, j'utilise (?<name>) pour diviser les résultats d'une correspondance en trois groupes "y", "m" et "d" représentant respectivement l'année, le mois et le jour.
Maintenant que nous avons le concept de groupes, voyons comment les regrouper. C'est très simple. En plus de la méthode ci-dessus, nous pouvons définir un groupe avec une paire de crochets. Par exemple, l'exemple ci-dessus peut être modifié comme suit :
public static void Main()
{
chaîne s = "2005-2-21" ;
Regex reg = new Regex (@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
Match match = reg.Match(s);
int année = int.Parse(match.Groups[1].Value);
int mois = int.Parse(match.Groups[2].Value);
int jour = int .Parse(match.Groups[3].Value);
DateTime heure = new DateTime (année, mois, jour);
Console.WriteLine(heure);
Console.ReadLine();
}
Comme le montre l'exemple ci-dessus, le groupe inclus dans la première paire de parenthèses est automatiquement numéroté 1 et les parenthèses suivantes sont numérotées 2, 3...
public static void Main()
{
chaîne s = "2005-2-21" ;
Regex reg = new Regex (@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .Compilé);
Match match = reg.Match(s);
int année = int.Parse(match.Groups[2].Value);
int mois = int.Parse(match.Groups[1].Value);
int jour = int .Parse(match.Groups[3].Value);
DateTime heure = new DateTime (année, mois, jour);
Console.WriteLine(heure);
Console.ReadLine();
}
En regardant à nouveau l'exemple ci-dessus, nous utilisons (?<number>) pour numéroter manuellement le groupe de chaque paire de crochets (notez que je n'ai pas défini les positions de 1 et 2 de gauche à droite
dans les trois exemples ci-dessus
).nous connaissons les trois façons de définir le groupe pour Regex et les méthodes correspondantes pour référencer les résultats de correspondance de groupe.
Ensuite, concernant la définition des groupes, veuillez noter deux autres points :
1. Comme les parenthèses sont utilisées pour définir les groupes, donc si vous souhaitez faire correspondre "(" et ")", veuillez utiliser "(" et ")" (à propos de tous spécial Pour la définition des caractères, veuillez consulter la documentation d'aide sur les expressions Regex correspondantes).
2. Si l'option ExplicitCapture est utilisée lors de la définition de Regex, le deuxième exemple ne réussira pas, car cette option nécessite un groupe explicitement défini avec un numéro ou un nom pour capturer et enregistrer les résultats si vous ne définissez pas l'option ExplicitCapture, et parfois. Si vous définissez une expression similaire à (A|B) et que vous ne souhaitez pas capturer le résultat de celle-ci (A|B), vous pouvez utiliser la syntaxe "groupe sans capture", qui est définie comme ( ?:) Méthode, pour (A|B), vous pouvez la définir comme ceci pour atteindre l'objectif de ne pas le capturer et l'enregistrer dans la collection Groupe - (?:A|B).