Expressions régulières .NET.NET Regular Expressions

Les expressions régulières permettent de traiter un texte de façon puissante, souple et efficace.Regular expressions provide a powerful, flexible, and efficient method for processing text. Grâce à la syntaxe complète des expressions régulières pour la recherche de correspondance avec un modèle, vous pouvez rapidement analyser des volumes importants de texte pour rechercher des modèles de caractères spécifiques, valider le texte pour vous assurer qu'il correspond à un modèle prédéfini (tel qu'une adresse e-mail), extraire, modifier, remplacer ou supprimer des sous-chaînes de texte et ajouter les chaînes extraites à une collection afin de générer un rapport.The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to find specific character patterns; to validate text to ensure that it matches a predefined pattern (such as an email address); to extract, edit, replace, or delete text substrings; and to add the extracted strings to a collection in order to generate a report. Pour de nombreuses applications qui traitent des chaînes ou qui analysent de grands blocs de texte, les expressions régulières constituent un outil indispensable.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Fonctionnement des expressions régulièresHow Regular Expressions Work

La pièce maîtresse du traitement d'un texte avec des expressions régulières est le moteur d'expression régulière, représenté par l'objet System.Text.RegularExpressions.Regex dans .NET.The centerpiece of text processing with regular expressions is the regular expression engine, which is represented by the System.Text.RegularExpressions.Regex object in .NET. Au minimum, vous devez fournir au moteur d'expression régulière les deux éléments d'information suivants pour traiter un texte à l'aide d'expressions régulières :At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • Le modèle d’expression régulière à identifier dans le texte.The regular expression pattern to identify in the text.

    Dans .NET, les modèles d’expression régulière sont définis par un langage ou une syntaxe spécifique, qui est compatible avec les expressions régulières Perl 5 et ajoute certaines fonctionnalités comme la mise en correspondance de la droite vers la gauche.In .NET, regular expression patterns are defined by a special syntax or language, which is compatible with Perl 5 regular expressions and adds some additional features such as right-to-left matching. Pour plus d’informations, consultez Langage des expressions régulières - Aide-mémoire.For more information, see Regular Expression Language - Quick Reference.

  • Le texte à analyser pour le modèle d’expression régulière.The text to parse for the regular expression pattern.

Les méthodes de la classe Regex vous permettent d'effectuer les opérations suivantes :The methods of the Regex class let you perform the following operations:

Pour obtenir une vue d’ensemble du modèle objet d’expression régulière, consultez Modèle objet d’expression régulière.For an overview of the regular expression object model, see The Regular Expression Object Model.

Pour plus d'informations sur le langage d'expression régulière, consultez Langage des expressions régulières - Aide-mémoire ou téléchargez et imprimez l'une des brochures suivantes :For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Aide-mémoire au format Word (.docx)Quick Reference in Word (.docx) format
Aide-mémoire au format PDF (.pdf)Quick Reference in PDF (.pdf) format

Exemples d'expressions régulièresRegular Expression Examples

La classe String comprend de nombreuses méthodes de recherche et de remplacement de chaîne qui vous permettent de trouver des chaînes littérales dans une chaîne plus grande.The String class includes a number of string search and replacement methods that you can use when you want to locate literal strings in a larger string. Les expressions régulières sont particulièrement utiles quand vous souhaitez trouver une sous-chaîne spécifique dans une chaîne plus grande ou identifier des modèles dans une chaîne, comme le montrent les exemples suivants.Regular expressions are most useful either when you want to locate one of several substrings in a larger string, or when you want to identify patterns in a string, as the following examples illustrate.

Exemple 1 : remplacement de sous-chaînesExample 1: Replacing Substrings

Supposons qu'une liste de diffusion contient des noms complets, constitués d'un prénom, d'un nom et, parfois, d'un titre (Mr, Mme ou Mlle).Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Si vous ne souhaitez pas inclure les titres quand vous générez les étiquettes des enveloppes à partir de la liste, vous pouvez utiliser une expression régulière pour supprimer les titres, comme le montre l'exemple suivant.If you do not want to include the titles when you generate envelope labels from the list, you can use a regular expression to remove the titles, as the following example illustrates.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
      string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels", 
                         "Abraham Adams", "Ms. Nicole Norris" };
      foreach (string name in names)
         Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
   }
}
// The example displays the following output:
//    Henry Hunt
//    Sara Samuels
//    Abraham Adams
//    Nicole Norris
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "(Mr\.? |Mrs\.? |Miss |Ms\.? )"
      Dim names() As String = { "Mr. Henry Hunt", "Ms. Sara Samuels", _
                                "Abraham Adams", "Ms. Nicole Norris" }
      For Each name As String In names
         Console.WriteLine(Regex.Replace(name, pattern, String.Empty))
      Next                                
   End Sub
End Module
' The example displays the following output:
'    Henry Hunt
'    Sara Samuels
'    Abraham Adams
'    Nicole Norris

Le modèle d’expression régulière (Mr\.? |Mrs\.? |Miss |Ms\.? ) trouve toute occurrence de « Mr  », « Mr.  », « Mrs  », « Mrs.  », « Miss  », « Ms  » ou « Ms.  ».The regular expression pattern(Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". L'appel de la méthode Regex.Replace remplace la chaîne mise en correspondance par String.Empty ; en d'autres termes, il la supprime de la chaîne d'origine.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Exemple 2 : identification des mots en doubleExample 2: Identifying Duplicated Words

La répétition d'un mot est une erreur de rédaction courante.Accidentally duplicating words is a common error that writers make. Vous pouvez utiliser une expression régulière pour identifier les mots en double, comme le montre l'exemple suivant.A regular expression can be used to identify duplicated words, as the following example shows.

using System;
using System.Text.RegularExpressions;

public class Class1
{
   public static void Main()
   {
      string pattern = @"\b(\w+?)\s\1\b";
      string input = "This this is a nice day. What about this? This tastes good. I saw a a dog.";
      foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
         Console.WriteLine("{0} (duplicates '{1}') at position {2}", 
                           match.Value, match.Groups[1].Value, match.Index);
   }
}
// The example displays the following output:
//       This this (duplicates 'This') at position 0
//       a a (duplicates 'a') at position 66
Imports System.Text.RegularExpressions

Module modMain
   Public Sub Main()
      Dim pattern As String = "\b(\w+?)\s\1\b"
      Dim input As String = "This this is a nice day. What about this? This tastes good. I saw a a dog."
      For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
         Console.WriteLine("{0} (duplicates '{1}') at position {2}", _
                           match.Value, match.Groups(1).Value, match.Index)
      Next
   End Sub
End Module
' The example displays the following output:
'       This this (duplicates 'This') at position 0
'       a a (duplicates 'a') at position 66

Le modèle d'expression régulière \b(\w+?)\s\1\b peut être interprété comme suit :The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

\b Commencer à la limite d'un mot.Start at a word boundary.
(\w+?)(\w+?) Correspond à un ou plusieurs caractères alphabétiques, mais le moins de caractères possible.Match one or more word characters, but as few characters as possible. Ensemble, ils forment un groupe identifiable par \1.Together, they form a group that can be referred to as \1.
\s Mettre en correspondance un espace blanc.Match a white-space character.
\1 Mettre en correspondance la sous-chaîne égale au groupe nommé \1.Match the substring that is equal to the group named \1.
\b Mettre en correspondance la limite d'un mot.Match a word boundary.

La méthode Regex.Matches est appelée avec les options d'expression régulière définies sur RegexOptions.IgnoreCase.The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. Ainsi, l'opération de mise en correspondance ne fait pas la distinction entre minuscules et majuscules, et l'exemple identifie la sous-chaîne « This this » comme étant une duplication.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Notez que la chaîne d'entrée comprend la sous-chaîne « this?Note that the input string includes the substring "this? This ».This". Toutefois, en raison du signe de ponctuation intermédiaire, cette sous-chaîne n'est pas identifiée comme étant une duplication.However, because of the intervening punctuation mark, it is not identified as a duplication.

Exemple 3 : création dynamique d'une expression régulière dépendante de la cultureExample 3: Dynamically Building a Culture-Sensitive Regular Expression

L’exemple suivant illustre la puissance des expressions régulières combinée à la souplesse offerte par les fonctionnalités de globalisation de .NET.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. Il utilise l'objet NumberFormatInfo pour déterminer le format de la devise dans la culture actuelle du système.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. Ensuite, à partir de cette information, il construit dynamiquement une expression régulière qui extrait du texte les valeurs en devise.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Pour chaque correspondance, il extrait le sous-groupe qui contient uniquement la chaîne numérique, le convertit en une valeur Decimal, puis calcule un total cumulé.For each match, it extracts the subgroup that contains the numeric string only, converts it to a Decimal value, and calculates a running total.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Define text to be parsed.
      string input = "Office expenses on 2/13/2008:\n" + 
                     "Paper (500 sheets)                      $3.95\n" + 
                     "Pencils (box of 10)                     $1.00\n" + 
                     "Pens (box of 10)                        $4.49\n" + 
                     "Erasers                                 $2.19\n" + 
                     "Ink jet printer                        $69.95\n\n" + 
                     "Total Expenses                        $ 81.58\n"; 
      
      // Get current culture's NumberFormatInfo object.
      NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + 
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + 
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" + 
                       (! symbolPrecedesIfPositive ? currencySymbol : ""); 
      Console.WriteLine( "The regular expression pattern is:");
      Console.WriteLine("   " + pattern);      

      // Get text that matches regular expression pattern.
      MatchCollection matches = Regex.Matches(input, pattern, 
                                              RegexOptions.IgnorePatternWhitespace);               
      Console.WriteLine("Found {0} matches.", matches.Count); 

      // Get numeric string, convert it to a value, and add it to List object.
      List<decimal> expenses = new List<Decimal>();
                     
      foreach (Match match in matches)
         expenses.Add(Decimal.Parse(match.Groups[1].Value));      

      // Determine whether total is present and if present, whether it is correct.
      decimal total = 0;
      foreach (decimal value in expenses)
         total += value;
      
      if (total / 2 == expenses[expenses.Count - 1]) 
         Console.WriteLine("The expenses total {0:C2}.", expenses[expenses.Count - 1]);
      else
         Console.WriteLine("The expenses total {0:C2}.", total);
   }  
}
// The example displays the following output:
//       The regular expression pattern is:
//          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
//       Found 6 matches.
//       The expenses total $81.58.
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Module Example
   Public Sub Main()
      ' Define text to be parsed.
      Dim input As String = "Office expenses on 2/13/2008:" + vbCrLf + _
                            "Paper (500 sheets)                      $3.95" + vbCrLf + _
                            "Pencils (box of 10)                     $1.00" + vbCrLf + _
                            "Pens (box of 10)                        $4.49" + vbCrLf + _
                            "Erasers                                 $2.19" + vbCrLf + _
                            "Ink jet printer                        $69.95" + vbCrLf + vbCrLf + _
                            "Total Expenses                        $ 81.58" + vbCrLf
      ' Get current culture's NumberFormatInfo object.
      Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
      ' Assign needed property values to variables.
      Dim currencySymbol As String = nfi.CurrencySymbol
      Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0)
      Dim groupSeparator As String = nfi.CurrencyGroupSeparator
      Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator

      ' Form regular expression pattern.
      Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ""))) + _
                              "\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + _
                              Regex.Escape(decimalSeparator) + "[0-9]+)?)" + _
                              CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, "")) 
      Console.WriteLine("The regular expression pattern is: ")
      Console.WriteLine("   " + pattern)      

      ' Get text that matches regular expression pattern.
      Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace)               
      Console.WriteLine("Found {0} matches. ", matches.Count)

      ' Get numeric string, convert it to a value, and add it to List object.
      Dim expenses As New List(Of Decimal)
                     
      For Each match As Match In matches
         expenses.Add(Decimal.Parse(match.Groups.Item(1).Value))      
      Next

      ' Determine whether total is present and if present, whether it is correct.
      Dim total As Decimal
      For Each value As Decimal In expenses
         total += value
      Next
      
      If total / 2 = expenses(expenses.Count - 1) Then
         Console.WriteLine("The expenses total {0:C2}.", expenses(expenses.Count - 1))
      Else
         Console.WriteLine("The expenses total {0:C2}.", total)
      End If   
   End Sub
End Module
' The example displays the following output:
'       The regular expression pattern is:
'          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
'       Found 6 matches.
'       The expenses total $81.58.

Sur un ordinateur dont la culture actuelle est anglais-États-Unis (en-US), l'exemple crée dynamiquement l'expression régulière \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?).On a computer whose current culture is English - United States (en-US), the example dynamically builds the regular expression \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?). Ce modèle d’expression régulière peut être interprété comme suit :This regular expression pattern can be interpreted as follows:

\$ Rechercher une occurrence unique du symbole dollar ($) dans la chaîne d'entrée.Look for a single occurrence of the dollar symbol ($) in the input string. La chaîne du modèle d'expression régulière comprend une barre oblique inverse pour indiquer que le symbole dollar doit être interprété littéralement et non comme une ancre d'expression régulière.The regular expression pattern string includes a backslash to indicate that the dollar symbol is to be interpreted literally rather than as a regular expression anchor. (Le symbole $ seul indiquerait au moteur d'expression régulière de débuter la recherche de correspondance à la fin d'une chaîne.) Pour que le symbole de devise de la culture actuelle ne soit pas interprété à tort comme un symbole d'expression régulière, l'exemple appelle la méthode Escape pour placer le caractère dans une séquence d'échappement.(The $ symbol alone would indicate that the regular expression engine should try to begin its match at the end of a string.) To ensure that the current culture's currency symbol is not misinterpreted as a regular expression symbol, the example calls the Escape method to escape the character.
\s* Rechercher zéro occurrence, ou plus, d'un espace blanc.Look for zero or more occurrences of a white-space character.
[-+]? Rechercher zéro ou une occurrence d'un signe positif ou d'un signe négatif.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Les parenthèses externes de cette expression définissent celle-ci en tant que groupe de capture ou que sous-expression.The outer parentheses around this expression define it as a capturing group or a subexpression. Si une correspondance est trouvée, les informations sur cette partie de la chaîne correspondante peuvent être récupérées du deuxième objet Group dans l'objet GroupCollection retourné par la propriété Match.Groups.If a match is found, information about this part of the matching string can be retrieved from the second Group object in the GroupCollection object returned by the Match.Groups property. (Le premier élément de la collection représente la correspondance entière.)(The first element in the collection represents the entire match.)
[0-9]{0,3} Rechercher entre zéro et trois occurrences des chiffres décimaux allant de 0 à 9.Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Rechercher zéro occurrence, ou plus, d'un séparateur de groupes suivi de trois chiffres décimaux.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Rechercher une occurrence unique du séparateur décimal.Look for a single occurrence of the decimal separator.
[0-9]+ Rechercher un ou plusieurs chiffres décimaux.Look for one or more decimal digits.
(\.[0-9]+)? Rechercher zéro ou une occurrence du séparateur décimal suivie d'au moins un chiffre décimal.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Si chacun de ces sous-modèles est trouvé dans la chaîne d'entrée, la recherche de correspondance réussit, et un objet Match contenant des informations sur la correspondance est ajouté à l'objet MatchCollection.If each of these subpatterns is found in the input string, the match succeeds, and a Match object that contains information about the match is added to the MatchCollection object.

TitreTitle DescriptionDescription
Langage des expressions régulières - Aide-mémoireRegular Expression Language - Quick Reference Fournit des informations sur le jeu de caractères, d'opérateurs et de constructions permettant de définir des expressions régulières.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Modèle objet d’expression régulièreThe Regular Expression Object Model Fournit des informations et des exemples de code illustrant l'utilisation des classes d'expression régulière.Provides information and code examples that illustrate how to use the regular expression classes.
Comportement détaillé des expressions régulièresDetails of Regular Expression Behavior Fournit des informations sur les fonctionnalités et le comportement des expressions régulières .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Exemples d'expressions régulièresRegular Expression Examples Fournit des exemples de code illustrant des utilisations courantes des expressions régulières.Provides code examples that illustrate typical uses of regular expressions.

RéférenceReference

System.Text.RegularExpressions
System.Text.RegularExpressions.Regex
Expressions régulières - Aide-mémoire (téléchargement au format Word)Regular Expressions - Quick Reference (download in Word format)
Expressions régulières - Aide-mémoire (téléchargement au format PDF)Regular Expressions - Quick Reference (download in PDF format)