Expression régulière | Expression rationnelle (C#)

by Fabien Lavocat 1. November 2007 03:06

Qu'est ce qu'une expression régulière, comment l'écrire, comment l'utiliser en .NET ? Voilà les questions que nous aborderons dans cet article.

Expression régulière, expression rationnelle

Une expression régulière ou expression rationnelle (Anglais : regular expression) est une chaîne de caractères permettant de d'écrire un ensemble de chaînes de caractères selon une syntaxe dont nous verrons les spécificités dans le chapitre suivant. Vous trouverez les abréviations regex ou regexp tout au long de cet article ainsi que sur les différents sites de développements. Elles sont utilisées dans plusieurs cas :

  • Les shells UNIX les utilisent pour faire des cherches de fichiers.
  • Vérifier la forme d'une chaîne de caractères. C'est-à-dire vérifier si une chaîne caractères saisie par un utilisateur est correcte par rapport à ce que l'on attend. Par exemple un utilisateur saisie une adresse email et grâce à une expression régulière, on peut vérifier que cette adresse est syntaxiquement correcte.
  • Il est également possible d'effectuer des traitements sur des chaînes de caractères, comme remplacer un morceau de cette dernière par un autre, découper cette chaîne...

La syntaxe

Les métacaractères

SymboleSignification
^ Correspond à un début de chaîne.
$ Correspond à une fin de chaîne.
\ Correspond à un caractère d'échappement.
. Correspond à n'importe quel caractère.
| Correspond à un des termes séparés par le caractère |.
() Correspond à un groupement.
- Correspond à une intervalle de caractères.
[] Correspond à un ensemble de caractères.
[^] Correspond à tout sauf l'ensemble de caractères.
+ Une fois ou plus.
? Zéro ou une fois.
* Zéro ou plusieurs fois.
{x} x fois exactement (Où x est un nombre).
{x,} x fois ou moins (Où x est un nombre).
{x,y} Entre x et y fois (Où x et y sont des nombres).

Grâce à ces métacaractères, il est possible de faire une infinité de combinaisons pour adapter à nos besoins.

Les caractères d'échappement

Le caractère d'échappement \ (backslash) indique que le caractère situé après le backslash n'est pas un opérateur mais un caractère Unicode.

Caractère d'échappementDescription
\t Correspond à une tabulation.
\r Correspond à un retour chariot.
\v Correspond à une tabulation verticale.
\f Correspond à un défilement de ligne.
\n Correspond à une nouvelle ligne.
\040 Correspond à un caractère ASCII codé sous la forme Octale (Maximum 3 chiffres). Ici le caractère \040 représente un espace.
\x20 Correspond à un caractère ASCII en utilisant sa représentation hexadécimale (codée sur deux chiffres).
\cC Correspond à un caractère de contrôle ASCII. Ici le caractère \cC correspond à Ctrl-C.
\u0020 Correspond à un caractère Unicode représenté sous sa forme Hexadécimale (codage sur quatre chiffres). Ici \u0020 correspond à un espace.
\ Représente, lorsque ce caractère d'échappement est suivi d'un caractère non identifié comme caractère d'échappement, le caractère par lui-meme.
\w Correspond à n'importe quel caractère alphabétique.
\W Correspond à n'importe quel caractère non alphabétique.
\s Correspond à tout caractère espace blanc.
\S Correspond à tout caractère autre qu'un espace blanc.
\d Correspond à n'importe quel chiffre décimal.
\D Correspond à un caractère ne représentant pas un chiffre.

Exemple 1 : Adresse email

Comme vous le savez sûrement, une adresse email est composée en 4 parties :

  • La partie de gauche : Nom du propriétaire de l'adresse (Composé de caractères alphanumérique et d'éventuels '.', '-')
  • Le caractère @
  • Le sous-domaine (Eventuel) et le domaine (Composé de caractères alphanumérique et d'éventuels '.', '-')
  • Un point '.' puis l'extention de domaine (entre 2 et 4 caractères).

Donc pour la première partie, nous devons avoir : "[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*" Pour la seconde : "@" Ensuite pour les éventuels sous-domaine et le nom de domaine : "[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" Enfin pour l'extention de domaine : "\.[a-z]{2,4}" Il ne faut pas oublier qu'une expression régulière commence par un ^ et termine par un $. Nous avons donc pour vérifier une adresse email l'expression suivante : ^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-z]{2,4}$ Bien sûr cette expression peut être améliorée en définissant en dur toutes les extensions de domaines...

Exemple 2 : Adresse IP

Une adresse IP est composée de 4 blocs de 1 à 3 chiffres séparés par des ".". Donc : xxx.xxx.xxx.xxx Les nombres allant de 1 Ã 254 (255 pour les masques de réseaux, sous-réseaux) L'expression régulière pour une adresse IP sera donc : ^(25[0-4]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-4]|2[0-4]\d|[0-1]?\d?\d)){3}$

Utilisation en .NET

Le namespace System.Text.RegularExpressions

La technologie .NET utilise des librairies accessibles grâce aux espaces de nom (Anglais : namespaces). Pour les expressions régulières, nous utilisons le namespace System.Text.RegularExpressions. Donc avant de commencer à coder, n'oubliez pas d'importer ce namespace : using System.Text.RegularExpressions;

Validation d'une chaîne

Validation d'une adresse eMail en C#

Afin de valider ou non une adresse email, nous allons créer une fonction IsEmail() qui nous retournera un booléen qui sera fonction de la validation de l'adresse.

   1: static Boolean IsEmail(String address)
   2: {
   3:      String pattern = @"^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*"
   4:                         + @"@"
   5:                         + @"[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*"
   6:                         + @"\.[a-z]{2,4}$";
   7:      // Création de note Objet de type System.Text.RegularExpressions.Regex
   8:     // Le constructeur nous demande le pattern de l’expression régulière
   9:      Regex regex = new Regex(pattern);
  10:      // On retourne un résultat pour notre chaîne “address” grace à la fonction IsMatch()
  11:     return regex.IsMatch(address);
  12: } 
Vous noterez que j'ai utilisé des @ devant l'expression régulière car celle-ci contient des \ qui sont des caractères d'échappement pour les chaînes de caractères. Vous pouvez donc soit les doubler \\ soit utiliser un @ devant la chaîne. Nous utilisons la fonction IsMatch() de l'objet System.Text.RegularExpressions.Regex afin de savoir si la chaîne que nous lui passons en paramètre est syntaxiquement correcte par rapport à l'expression régulière que nous avons passé en paramètre du constructeur. Si nous passons la chaîne "fabien.lavocat@blog-microsoft.fr" à notre fonction, elle nous retournera : True. Avec la chaîne ".lavocat@blog-microsoft.fr", la fonction nous retourne : False.

Validation d'une adresse IP en C#

Afin de valider ou non une adresse IP, nous allons créer une fonction IsIP() qui nous retournera un booléen qui sera fonction de la validation de l'adresse.

   1: static Boolean IsIP(String address)
   2: {
   3:      String pattern = @"^(25[0-4]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-4]|2[0-4]\d|[0-1]?\d?\d)){3}$";
   4:      // Création de note Objet de type System.Text.RegularExpressions.Regex
   5:     // Le constructeur nous demande le pattern de l’expression régulière
   6:     Regex regex = new Regex(pattern);
   7:     // On retourne un résultat pour notre chaîne “address” grâce à  la fonction IsMatch()
   8:     return regex.IsMatch(address);
   9: }

Nous utilisons la fonction IsMatch() de l'objet System.Text.RegularExpressions.Regex afin de savoir si la chaîne que nous lui passons en paramètre est syntaxiquement correcte par rapport à l'expression régulière que nous avons passé en paramètre du constructeur. Si nous passons la chaîne "192.168.1.18" à notre fonction, elle nous retournera : True. Avec la chaîne "255.255.255.255", la fonction nous retourne : False.

Tags:

Comments

5/7/2010 7:08:41 PM #

MABROUKI

PEUX-TU NOUS INDIQUER S'il ya un editeur qui genere l'expression reguliere pour chaque specifique de validation lorsqu'on lui fournit un modele de chaine?
des exemples en vb.net serait les bienvenus.merci

MABROUKI Algeria

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



About

Fabien Lavocat

Lavocat Fabien
Ingénieur Multimédia - TMM Communication



"Blog-Microsoft.fr is an independent blog and is not affiliated with, nor has it been authorized, sponsored, or otherwise approved by Microsoft Corporation."

Contactez-moi Send mail

MVP
Microsoft Most Valuable Professional
Client Application Development