Backreferences

Une backreference identifie la sous-chaîne capturée par un groupe correspondant dans une expression régulière. Chaque backreference est identifiée par un nombre ou un nom et est désignée par la notation "\nombre" ou "\k<nom>". Par exemple, si la chaîne d'entrée contient plusieurs occurrences d'une sous-chaîne arbitraire, vous pouvez mettre en correspondance la première occurrence et un groupe de capture, puis utiliser une backreference pour mettre en correspondance les occurrences ultérieures de la sous-chaîne. Pour plus d'informations, consultez Constructions de backreference et Constructions de regroupement.

Les backreferences permettent de rechercher facilement des groupes de caractères récurrents. Il s'agit en quelque sorte d'instructions abrégées servant à retrouver une même chaîne. Ainsi, pour rechercher des caractères contigus récurrents tels que les deux « l » dans le mot « belle », vous devez utiliser l'expression régulière (?<char>\w)\k<char>, qui fait appel au métacaractère \w pour retrouver tout caractère isolé dans un mot. La construction de regroupement (?<char> ) entoure le métacaractère pour contraindre le moteur des expressions régulières à se rappeler une correspondance de sous-expressions (dans ce cas, il s'agit de n'importe quel caractère pris séparément) et à l'enregistrer sous le nom « char ». La construction de backreference \k<char> indique au moteur de comparer le caractère sélectionné au caractère trouvé précédemment et stocké sous l'intitulé « char ». L'expression régulière intégrale permet de retrouver une occurrence dans laquelle un caractère est identique au précédent.

Pour retrouver des mots entiers récurrents, il suffit de modifier la sous-expression de regroupement afin de rechercher un groupe de caractères précédé d'un espace au lieu de faire porter la recherche sur chaque caractère pris séparément. Vous pouvez remplacer \w+ par la sous-expression \w, qui recherche n'importe quel groupe de caractères, et utiliser le métacaractère \s pour rechercher un espace avant le groupe de caractères. Vous obtenez ainsi l'expression régulière (?<char>\s\w+)\k<char>, qui recherche n'importe quel mot entier récurrent, par exemple « les les », mais qui permet également de retrouver d'autres répétitions de la chaîne spécifiée, comme dans l'expression « les lessives ».

Pour vérifier que la deuxième occurrence se trouve sur une limite de mot, ajoutez le métacaractère \b après le paramètre de répétition. L'expression régulière obtenue, (?<char>\s\w+)\k<char>\b, recherche des mots entiers récurrents précédés uniquement d'espaces blancs.

Analyse des backreferences

Les expressions \1 à \9 renvoient toujours à des backreferences, pas aux codes octaux. Les expressions à plusieurs chiffres \11 et au-delà sont considérées comme des backreferences s'il existe une backreference correspondant à ce nombre ; sinon, elles sont interprétées comme des codes octaux (sauf si les premiers chiffres sont 8 ou 9, auquel cas elles sont gérées comme des « 8 » et « 9 » littéraux). Si une expression régulière contient une backreference à un numéro de groupe non défini, elle est considérée comme une erreur d'analyse. Si l'ambiguïté constitue un problème, vous pouvez utiliser la notation \k<n>, qui est sans équivoque et impossible à confondre avec des codes de caractères octaux ; de même, les codes hexadécimaux tels que \xdd sont sans ambiguïté et impossibles à confondre avec des backreferences.

Le comportement des backreferences diffère légèrement lorsque l'indicateur d'option ECMAScript est activé. Pour plus d'informations, consultez Comportement de correspondance des expressions régulières ECMASCRIPT et canoniques.

Recherche de correspondances de backreferences

Une backreference renvoie à la définition la plus récente d'un groupe (définition située à l'extrême gauche, lorsque la recherche s'effectue de gauche à droite). En particulier, lorsque qu'un groupe effectue plusieurs captures, une backreference renvoie à la plus récente. Par exemple, (?<1>a)(?<1>\1b)* correspond à aababb, avec le modèle de capture (a)(ab)(abb). Les quantifieurs en boucle ne suppriment pas les définitions de groupe.

Si un groupe n'a capturé aucune sous-chaîne, une backreference à ce groupe n'est pas définie et ne trouve aucune correspondance. Par exemple, l'expression \1() ne permet de trouver aucune occurrence, alors que l'expression ()\1 trouve la chaîne vide.

Voir aussi

Autres ressources

Expressions régulières du .NET Framework