Utiliser des expressions régulières dans Visual Studio

Visual Studio utilise des expressions régulières de .NET pour rechercher et remplacer du texte.

Syntaxe des expressions régulières

Le tableau suivant contient des caractères, des opérateurs, des constructions et des exemples de modèles relatifs aux expressions régulières. Pour obtenir une référence plus complète, consultez Langage des expressions régulières.

Objectif Expression Exemple
Correspond à n'importe quel caractère unique (sauf un saut de ligne). Pour plus d’informations, consultez N’importe quel caractère. . a.o correspond à « aro » dans « around » et à « abo » dans « about », mais pas à « acro » dans « across »
Correspond à zéro ou plusieurs occurrences de l'expression précédente (correspond à autant de caractères que possible). Pour plus d’informations, consultez Mettre en correspondance zéro occurrence ou plus. * a*r correspond à "r" dans "rack", à "rar" dans "ark" et à "aar" dans "aardvark"
Correspond à n’importe quel caractère zéro ou plusieurs fois. .* c.*e correspond à « cke » dans « racket », à « comme » dans « commentaire » et à « code » dans « code ».
Correspond à une ou plusieurs occurrences de l'expression précédente (correspond à autant de caractères que possible). Pour plus d’informations, consultez Mettre en correspondance une occurrence ou plus. + e+d correspond à « eed » dans « feeder » et « ed » dans « faded »
Faire correspondre à n'importe quel caractère une ou plusieurs fois. .+ e.+e correspond à « eede » dans « feeder », mais ne trouve aucune correspondance dans « feed »
Correspond à zéro ou plusieurs occurrences de l'expression précédente (correspond au minimum de caractères possible). Pour plus d’informations, consultez Mettre en correspondance zéro occurrence ou plus (correspondance paresseuse). *? \w*?d correspond à « fad » et « ed » dans « faded », mais pas à l’intégralité du mot « faded » en raison de la correspondance différée
Correspond à une ou plusieurs occurrences de l'expression précédente (correspond au minimum de caractères possible). Pour plus d’informations, consultez Mettre en correspondance une occurrence ou plus (correspondance paresseuse). +? e\w+? correspond à « ee » dans « asleep » et « ed » dans « faded » mais ne trouve aucune correspondance dans « fade »
Ancre la chaîne de correspondance au début d'une ligne ou d'une chaîne ^ ^car correspond au mot « car » uniquement quand il apparaît au début d’une ligne
Ancre la chaîne de correspondance à la fin d'une ligne \r?$ car\r?$ correspond à « car » uniquement lorsqu’il apparaît à la fin d’une ligne
Ancre la chaîne de correspondance à la fin du fichier $ car$ correspond à « car » uniquement lorsqu’il apparaît à la fin du fichier
Correspond à n'importe quel caractère unique d'un ensemble [abc] b[abc] correspond à « ba », « bb » et « bc »
Correspond à n'importe quel caractère dans une plage de caractères [a-f] be[n-t] correspond à « bet » dans « between », « ben » in « beneath », et « bes » dans « beside », mais ne trouve aucune correspondance dans « below »
Capture et numérote implicitement l'expression contenue dans les parenthèses () ([a-z])X\1 correspond à « aXa » et à « bXb », mais pas à « aXb ». « \1 » fait référence au premier groupe d’expressions « [a-z] ». Pour plus d’informations, consultez Groupes de capture et modèles de remplacement.
Invalide une correspondance (?!abc) real(?!ity) correspond à « real » dans « realty » et « really » mais pas dans « reality ». Il trouve également le deuxième « real » (mais pas le premier « real ») dans « realityreal ».
Correspond à n'importe quel caractère qui ne figure pas dans un ensemble donné de caractères. Pour plus d’informations, consultez Groupe de caractères négatif. [^abc] be[^n-t] correspond à « bef » dans « before », « beh » dans « behind » et « bel » dans « below », mais ne trouve aucune correspondance dans « beneath »
Correspond à l'expression placée avant ou après le symbole | (sponge|mud) bath correspond à « sponge bath » et à « mud bath »
Crée une séquence d'échappement pour le caractère placé après la barre oblique inverse \ \^ correspond au caractère ^
Spécifie le nombre d'occurrences du caractère ou du groupe précédent. Pour plus d’informations, consultez Mettre en correspondance exactement n occurrences. {n}, où n est le nombre d'occurrences x(ab){2}x correspond à « xababx »
x(ab){2,3}x correspond à « xababx » et à « xabababx », mais pas à « xababababx »
Mettre en correspondance un texte dans une catégorie Unicode. Pour plus d’informations sur les classes de caractères Unicode, consultez Propriétés des caractères Unicode Standard 15.0. \p{X}, où "X" est le numéro Unicode. \p{Lu} correspond à « T » et à « D » dans « Thomas Doe »
Correspond à la limite d'un mot \b (en dehors d’une classe de caractères \b spécifie une limite de mot et, à l’intérieur d’une classe de caractères, \b spécifie un retour arrière) \bin correspond à « in » dans « inside », mais ne trouve aucune correspondance dans « pinto »
Correspondance avec un saut de ligne (c'est-à-dire un retour chariot suivi d'une nouvelle ligne ou une nouvelle ligne uniquement) \r?\n End\r?\nBegin correspond à « End » et à « Begin » uniquement quand « END » est la dernière chaîne d’une ligne et « Begin » est la première chaîne de la ligne suivante
Mettre en correspondance avec n’importe quel caractère alphabétique \w a\wd correspond à « add » et à « a1d », mais pas à « a d »
Correspond à n'importe quel espace blanc \s Public\sInterface correspond à l’expression « Public Interface »
Mettre en correspondance avec n’importe quel caractère numérique décimal \d \d correspond à « 4 » et « 0 » dans « wd40 »

Un exemple d’expression régulière qui combine certains des opérateurs et des constructions pour correspondre à un nombre hexadécimal est \b0[xX]([0-9a-fA-F]+)\b. Cette expression correspond à « 0xc67f », mais pas à « 0xc67g ».

Conseil

Dans les systèmes d’exploitation Windows, la plupart des lignes se terminent par « \r\n » (retour chariot suivi d’une nouvelle ligne). Ces caractères ne sont pas visibles, mais ils sont présents dans l’éditeur et transmis au service d’expressions régulières de .NET. Lorsque vous traitez des fichiers provenant du Web ou d'un système d'exploitation autre que Windows, veillez à tenir compte de la possibilité qu'ils utilisent uniquement le retour à la ligne pour un saut de ligne.

Groupes de capture et modèles de remplacement

Un groupe de capture délimite une sous-expression d’une expression régulière et capture une sous-chaîne d’une chaîne d’entrée. Vous pouvez utiliser les groupes de capture dans l’expression régulière elle-même (par exemple pour rechercher un mot en double), ou dans un modèle de remplacement. Pour plus d’informations, consultez Constructions de regroupement dans les expressions régulières.

Pour créer un groupe de capture numéroté, placez la sous-expression entre parenthèses dans le modèle d’expression régulière. Les captures sont numérotées automatiquement de la gauche vers la droite en fonction de l'ordre des parenthèses ouvrantes dans l'expression régulière. Pour accéder au groupe de capture, prenez en compte les exemples suivants :

  • Dans l’expression régulière : utilisez \number. Par exemple, \1 dans l’expression régulière (\w+)\s\1 fait référence au premier groupe de capture (\w+).

  • Dans un modèle de remplacement : utilisez $number. Par exemple, l’expression régulière groupée (\d)([a-z]) définit deux groupes : le premier contient un chiffre décimal unique tandis que le deuxième contient un caractère unique compris entre a et z. L’expression recherche quatre correspondances dans la chaîne suivante : 1a 2b 3c 4d. La chaîne de remplacement z$1 référence le premier groupe uniquement ($1) et convertit la chaîne en z1 z2 z3 z4.

L’illustration suivante montre une expression régulière (\w+)\s\1 et une chaîne de remplacement $1. L’expression régulière et le modèle de remplacement font référence au premier groupe de capture qui a reçoit automatiquement le numéro 1. Lorsque vous choisissez Remplacer tout dans la boîte de dialogue Remplacement rapide de Visual Studio, les mots répétés sont supprimés du texte.

Capture d’écran de Remplacement rapide montrant un groupe de capture numéroté dans Visual Studio.

Conseil

Dans la boîte de dialogue Remplacement rapide, veillez à sélectionner le bouton Utiliser les expressions régulières ou appuyez sur Alt+E.

Groupes de capture nommés

Au lieu d’utiliser la numérotation automatique d’un groupe de capture, vous pouvez lui donner un nom. La syntaxe pour un groupe de capture nommé est (?<name>subexpression).

Les groupes de capture nommés, tout comme les groupes numérotés, peuvent être utilisés dans l’expression régulière elle-même ou dans un modèle de remplacement. Pour accéder au groupe de capture nommé, tenez compte des exemples suivants :

  • Dans l’expression régulière : utilisez \k<name>. Par exemple, \k<repeated> dans l’expression régulière (?<repeated>\w+)\s\k<repeated> fait référence au groupe de capture nommé repeated et dont la sous-expression est \w+.

  • Dans un modèle de remplacement : utilisez ${name}. Par exemple : ${repeated}.

L’illustration suivante montre une expression régulière (?<repeated>\w+)\s\k<repeated> et une chaîne de remplacement ${repeated}. L’expression régulière et le modèle de remplacement font référence au groupe de capture nommé repeated. Lorsque vous choisissez Remplacer tout dans la boîte de dialogue Remplacement rapide de Visual Studio, les mots répétés sont supprimés du texte.

Capture d’écran de Remplacement rapide montrant un groupe de capture nommé dans Visual Studio.

Conseil

Veillez à sélectionner le bouton Utiliser les expressions régulières (ou appuyez sur Alt+E) dans la boîte de dialogue Remplacement rapide.

Pour plus d'informations sur les groupes de capture nommés, voir Sous-expressions mises en correspondance nommées. Pour plus d’informations sur les expressions régulières utilisées dans les modèles de remplacement, consultez Substitutions dans les expressions régulières.

Exemples

Modèle Description
int ([_A-Za-z][_A-Za-z0-9]*) Faites correspondre les définitions d'un seul entier. Les identificateurs commencent par une lettre majuscule ou minuscule, suivie de zéro ou plusieurs lettres ou chiffres (indiqués par *). L'identifiant est capturé comme $1 par les parenthèses extérieures.
(private|internal|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ Fait correspondre les déclarations d'entiers C# qui sont initialisés à des littéraux entiers, en capturant les différentes parties, y compris le niveau d'accès, les modificateurs tels que const ou static, l'identificateur et la valeur définie. Notez l'utilisation de \s+ pour au moins un caractère d'espacement, ou \s* si un espacement peut ou ne peut pas se produire.
foreach\s*\(([\w\d]*)\s+([\w\d]*)\s+in\s+(.*)\) Correspond à la première ligne d'une boucle foreach. Les parenthèses littérales sont échappées à l'aide d'une barre oblique inverse (\). Les différents groupes sont désignés par $1, $2 et $3 par les parenthèses non encapsulées.
#define\s+([_A-Za-z][_A-Za-z0-9]*) Correspond aux définitions #define (sans la valeur, le cas échéant). Le jeton défini est stocké dans $1.
#include\s+["<](.*)[">] Faites correspondre les inclusions dans un fichier source C++.