Expressions régulières en C# avec exemples : en pratique
Les expressions régulières (regex) sont un outil puissant pour rechercher, valider et remplacer du texte selon un motif. En C# (.NET), elles sont implémentées via la classe System.Text.RegularExpressions.Regex. Dans cet article, nous explorerons les principales fonctionnalités avec des exemples concrets : de la simple validation d'email à l'extraction de données depuis du HTML. Tous les exemples sont prêts à être copiés et utilisés dans vos projets.
Fondamentaux de Regex en C#
La classe Regex propose trois méthodes clés :
- IsMatch — vérifie si la chaîne correspond au motif ;
- Match — trouve la première correspondance ;
- Matches — trouve toutes les correspondances.
Un exemple simple — vérifier si la chaîne contient des chiffres :
using System;using System.Text.RegularExpressions;
public class RegexExample{ public static void Main() { string text = "Mon numéro : 12345"; string pattern = @"\\d+"; // un ou plusieurs chiffres
bool hasDigits = Regex.IsMatch(text, pattern); Console.WriteLine(hasDigits); // True }}Notez le @ avant la chaîne — c'est un littéral de chaîne verbatim, qui désactive l'échappement de la barre oblique inverse. Sans lui, il faudrait écrire "\\\\d+".
Validation d'email et de numéro de téléphone
Validation d'email
La validation d'email est une tâche classique. Un motif simple mais fonctionnel :
public static bool IsValidEmail(string email){ string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; return Regex.IsMatch(email, pattern);}
// UtilisationConsole.WriteLine(IsValidEmail("user@example.com")); // TrueConsole.WriteLine(IsValidEmail("user@.com")); // FalseDécortiquons le motif :
^— début de la chaîne ;[a-zA-Z0-9._%+-]+— partie locale (lettres, chiffres et caractères spéciaux) ;@— symbole "arobase" ;[a-zA-Z0-9.-]+— domaine ;\\.— point (échappé) ;[a-zA-Z]{2,}— zone de domaine (au moins 2 lettres) ;$— fin de la chaîne.
Validation de numéro de téléphone
Exemple pour le format russe (+7 XXX XXX-XX-XX) :
public static bool IsValidRussianPhone(string phone){ string pattern = @"^\\+7\\d{3}\\d{3}-\\d{2}-\\d{2}$"; // Ou une variante plus flexible : // @"^\\+7[\\s-]?\\d{3}[\\s-]?\\d{3}[\\s-]?\\d{2}[\\s-]?\\d{2}$" return Regex.IsMatch(phone, pattern);}Extraction de données d'un texte à l'aide de groupes de capture
Les groupes de capture (parenthèses ()) permettent d'extraire des parties de la correspondance. Par exemple, extrayons tous les emails d'un texte :
string text = "Contacts : support@site.com, admin@test.org, info@company.net";string pattern = @"([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\.([a-zA-Z]{2,})";
MatchCollection matches = Regex.Matches(text, pattern);foreach (Match match in matches){ Console.WriteLine($"Email complet : {match.Value}"); Console.WriteLine($"Partie locale : {match.Groups[1].Value}"); Console.WriteLine($"Domaine : {match.Groups[2].Value}"); Console.WriteLine($"Zone : {match.Groups[3].Value}"); Console.WriteLine("---");}Résultat :
Email complet : support@site.comPartie locale : supportDomaine : siteZone : com---Les groupes sont numérotés à partir de 1 (le groupe 0 correspond à l'ensemble de la correspondance). On peut leur donner des noms :
string pattern = @"(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+)\\.(?<tld>[a-zA-Z]{2,})";// Accès : match.Groups["user"].ValueExtraction de liens depuis du HTML
string html = @"<a href='https://example.com'>Examp