Expressions régulières en C# : guide complet pour débutants
\nLes expressions régulières (regular expressions, regex) sont un outil puissant pour rechercher, remplacer et valider des chaînes selon un motif donné. En C# (.NET), le travail avec les expressions régulières est implémenté via l'espace de noms System.Text.RegularExpressions. Cet article vous aidera à maîtriser les bases : de la création de motifs simples à l'utilisation de toutes les fonctionnalités de la classe Regex.
1. Bases du travail avec Regex en C#
\nPour commencer, importez l'espace de noms :
\nusing System.Text.RegularExpressions;\nLa classe Regex fournit des méthodes statiques et d'instance. La façon la plus simple de vérifier si une chaîne contient une sous-chaîne correspondant à un motif est la méthode IsMatch :
string text = "Bonjour, mon email : test@example.com";\nstring pattern = @"\\w+@\\w+\\.\\w+"; // motif simple d'email\n\nbool hasEmail = Regex.IsMatch(text, pattern);\nConsole.WriteLine(hasEmail); // True\nAnalyse du motif :
\n- \n
\\w+— une ou plusieurs lettres, chiffres ou tirets bas \n@— le symbole "arobase" \n\\.— point échappé (sans échappement, le point signifie "n'importe quel caractère") \n
Pour des appels répétés, il est préférable de créer un objet Regex afin d'éviter une recompilation du motif :
Regex emailRegex = new Regex(@"\\w+@\\w+\\.\\w+");\nConsole.WriteLine(emailRegex.IsMatch("admin@site.ru")); // True\n\n2. Recherche de toutes les correspondances : Match et MatchCollection
\nLa méthode Match retourne la première correspondance, tandis que Matches retourne toutes les correspondances sous forme de collection MatchCollection. Chaque objet Match contient des informations sur la sous-chaîne trouvée, sa position et sa longueur.
Exemple : extraction de tous les nombres d'une chaîne
\nstring data = "En 2023, il y a eu 15 événements, en 2024 — déjà 23.";\nstring numberPattern = @"\\d+"; // un ou plusieurs chiffres\n\nMatchCollection matches = Regex.Matches(data, numberPattern);\n\nforeach (Match match in matches)\n{\n Console.WriteLine($"Trouvé : {match.Value} à la position {match.Index}");\n}\n// Affichage :\n// Trouvé : 2023 à la position 3\n// Trouvé : 15 à la position 22\n// Trouvé : 2024 à la position 37\n// Trouvé : 23 à la position 51\nTravail avec les groupes (Group). Les groupes permettent d'extraire des parties d'une correspondance. Par exemple, lors de la recherche d'une date au format "jj.mm.aaaa", on peut obtenir séparément le jour, le mois et l'année :
\nstring input = "Aujourd'hui 25.12.2024";\nstring datePattern = @"(\\d{2})\\.(\\d{2})\\.(\\d{4})";\n\nMatch match = Regex.Match(input, datePattern);\nif (match.Success)\n{\n Console.WriteLine($"Jour : {match.Groups[1].Value}"); // 25\n Console.WriteLine($"Mois : {match.Groups[2].Value}"); // 12\n Console.WriteLine($"Année : {match.Groups[3].Value}"); // 2024\n}\nLes groupes sont numérotés à partir de 1 (le groupe 0 correspond à l'ensemble de la correspondance). Les groupes nommés sont plus faciles à lire :
\nstring namedPattern = @"(?<day>\\d{2})\\.(?<month>\\d{2})\\.(?<year>\\d{4})";\nmatch = Regex.Match(input, namedPattern);\nConsole.WriteLine(match.Groups["day"].Value); // 25\n\n3. Fonctionnalités avancées : remplacements et options
\nRemplacement de texte avec Regex.Replace. Permet non seulement de supprimer ou remplacer une sous-chaîne, mais aussi d'utiliser des groupes dans la chaîne de remplacement :
\nstring phone = "+7 (123) 456-78-90";\n// Supprime tout sauf les chiffres\nstring clean = Regex.Replace(phone, @"[^\\d]", "");\nConsole.WriteLine(clean); // 71234567890\n\n// Change le format : (123) 456-78-90 → 123-456-7890\nstring formatted = Regex.Replace(phone, \n @"\\((\\d{3})\\)\\s*(\\d{3})-(\\d{2})-(\\d{2})",\n "$1-$2-$3$4");\nConsole.WriteLine(formatted); // 123-456-7890\nOptions importantes (RegexOptions) :
\n- \n