Partager via


Backreferences dans JScript

Mise à jour : novembre 2007

L'une des fonctionnalités les plus importantes des expressions régulières est la capacité de stocker une partie d'un modèle mis en correspondance à des fins d'utilisation ultérieure. Comme précédemment décrit, lorsque vous entourez un modèle d'expression régulière ou une partie de celui-ci de parenthèses, cette partie de l'expression est alors stockée dans une mémoire tampon temporaire. Vous pouvez substituer la capture en utilisant les métacaractères ?:, ?= ou ?! qui empêchent cette capture.

Utilisation de Backreferences

Chaque sous-correspondance capturée est enregistrée lorsque qu'elle est trouvée de gauche à droite dans un modèle d'expression régulière. Les numéros de la mémoire tampon vont de 1 à 99 sous-expressions capturées. Il est possible d'accéder à chaque mémoire tampon à l'aide de \n, n représentant l'un ou les deux chiffres décimaux identifiant une mémoire tampon spécifique.

L'une des applications les plus simples et les plus utiles des backreferences consiste à permettre de localiser l'occurrence de deux mots identiques et adjacents dans un texte. Prenons l'exemple suivant :

Is is the cost of of gasoline going up up?

La phrase ci-dessus comporte effectivement plusieurs doublons. Il serait intéressant de trouver un moyen de corriger cette phrase sans devoir rechercher des doublons de chaque mot. L'expression régulière suivante utilise, à cette fin, une seule sous-expression :

/\b([a-z]+) \1\b/gi

L'expression capturée, telle qu'elle est indiquée par [a-z]+, inclut un ou plusieurs caractères alphabétiques. La seconde partie de l'expression régulière est la référence à la sous-correspondance précédemment capturée, c'est-à-dire la deuxième occurrence du mot correspondant à l'expression placée entre parenthèses. \1 spécifie la première sous-correspondance. Les métacaractères de limite de mot garantissent que seuls les mots entiers sont pris en compte. Sinon, une expression telle que « is issued » ou « this is » " pourrait erronément être identifiée par cette expression.

L'indicateur global (g) qui suit l'expression régulière indique que l'expression s'applique à autant de correspondances possibles qu'elle trouve dans la chaîne d'entrée. Quant à l'indicateur case insensitivity (i) à la fin de l'expression, il indique le non-respect de la casse. L'indicateur multiline précise que les correspondances potentielles peuvent figurer de l'un des deux côtés d'un caractère de saut de ligne.

À l'aide de l'expression régulière ci-dessus, le code suivant peut utiliser les informations de la sous-expression pour remplacer une occurrence de deux mots consécutifs et identiques dans une chaîne de texte par une seule occurrence du même mot :

var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim;       //Create regular expression pattern.
var rv = ss.replace(re,"$1");   //Replace two occurrences with one.

L'utilisation de $1 dans la méthode replace fait référence à la première sous-correspondance enregistrée. Si vous aviez plusieurs sous-correspondances, vous feriez référence à celles-ci de façon consécutive en utilisant $2, $3, etc.

Les backreferences (références arrière) peuvent également subdiviser un URI (Universal Resource Indicator) en ses différents composants. Supposons que vous souhaitiez subdiviser l'URI suivant en protocole (ftp, http, etc.), adresse de domaine et page/chemin d'accès :

https://msdn.microsoft.com:80/scripting/default.htm

Les expressions régulières suivantes fournissent cette fonctionnalité :

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

La première sous-expression entre parenthèses capture la partie protocole de l'adresse Web. Cette sous-expression correspond à tout mot précédant deux points et deux barres obliques. La deuxième sous-expression entre parenthèses capture la partie adresse de domaine de l'adresse Web. Cette sous-expression correspond à un ou plusieurs caractères autres que / ou :. La troisième sous-expression entre parenthèses capture un numéro de port, si ce dernier est spécifié. Cette sous-expression correspond à zéro chiffre ou plus suivant un signe deux points. Vous ne pouvez pas répéter cette sous-expression plus d'une fois. Enfin, la quatrième sous-expression entre parenthèses capture les informations du chemin d'accès et/ou de la page indiquées dans l'adresse Web. Cette sous-expression correspond à toute séquence de caractères qui n'inclut pas les caractères # ou espace.

En appliquant l'expression régulière à l'URI ci-dessus, les sous-correspondances comprennent les éléments suivants :

  • RegExp.$1 contient « http ».

  • RegExp.$2 contient « msdn.microsoft.com ».

  • RegExp.$3 contient « :80 ».

  • RegExp.$4 contient « /scripting/default.htm ».

Voir aussi

Autres ressources

Introduction aux expressions régulières