Références arrières
En dehors des classes de caractères, un antislash suivi
d'un nombre plus grand que 0 (et possiblement plusieurs chiffres)
est une référence arrière vers un sous-masque capturant situé plus tôt
(c'est-à-dire à sa gauche) dans le masque,
en supposant qu'il y ait
suffisamment de sous-masques capturants précédents.
Cependant, si le nombre décimal suivant l'antislash est
plus petit que 10, il sera toujours considéré
comme une référence arrière, et cela
générera une erreur si le nombre de captures
n'est pas suffisant. En d'autres termes, pour les nombres inférieurs à 10,
les parenthèses référencées n'ont pas besoin de se trouver à gauche
de la référence. Une "référence arrière vers l'avant" peut avoir du sens
lorsqu'une répétition est en jeu et que le sous-masque situé à droite a
participé à une itération précédente. Voir la section sur les
séquences d'échappement
pour plus de détails sur le traitement des chiffres qui suivent l'antislash.
La référence arrière remplace ce qui a
été capturé par un sous-masque dans le
masque courant, plutôt que remplacer le sous-masque
lui-même. Ainsi
(calme|rapide) et \1ment
trouvera "calme et calmement"
et "rapide et rapidement", mais pas
"calme et rapidement". Si la recherche tient
compte de la casse, alors la casse de la chaîne
capturée sera importante. Par exemple,
((?i)rah)\s+\1
trouve "rah rah"
et "RAH RAH", mais pas "RAH rah",
même si le sous-masque capturant initial ne tenait pas compte
de la casse.
Il peut y avoir plusieurs références arrière dans
le même sous-masque. Si un sous-masque n'a pas été
utilisé dans une recherche, alors les références
arrière échoueront. Par exemple
(a|(bc))\2
ne réussira jamais si la chaîne sujet commence par
"a" plutôt que par "bc".
Étant donné qu'il peut y avoir jusqu'à 99 références
arrière, tous les chiffres après l'antislash sont
considérés comme faisant potentiellement partie de
la référence arrière. Si le masque recherche un
chiffre après la référence, alors il faut
impérativement utiliser des délimiteurs pour terminer
la référence arrière.
Si l'option PCRE_EXTENDED
est activée, on peut utiliser un espace.
Sinon, un commentaire vide fait l'affaire.
Une référence arrière qui intervient à l'intérieur de
parenthèses auxquelles elle fait référence
échouera dès que le sous-masque sera utilisé. Par exemple,
(a\1)
échouera toujours. Cependant, ces
références peuvent être utiles dans les
sous-masques répétitifs. Par exemple, le masque
"(a|b\1)+" pourra convenir pour "a",
"aba", "ababba", etc.
À chaque itération du sous-masque, la référence
arrière utilise la chaîne trouvée à l'itération précédente.
Pour que cela fonctionne, il faut que la première
itération n'ait pas besoin d'utiliser la référence
arrière. Cela arrive avec les alternatives, comme dans
l'exemple ci-dessus, ou avec un quantificateur de minimum 0.
La séquence d'échappement \g
peut être utilisée pour le référencement absolu et relatif des
sous-masques. Cette séquence doit être suivie par un nombre non signé
ou négatif, entouré optionnellement par des accolades. La séquence
\1, \g1 et \g{1}
sont identiques. L'utilisation de ce masque avec un nombre non signé peut
aider à lever l'ambiguïté inhérente aux chiffres qui suivent un
antislash. Cette séquence aide à distinguer les références arrière
des caractères octaux et rend également plus facile
d'avoir une référence arrière suivie par un nombre littéral, c.-à-d.
\g{2}1.
L'utilisation de la séquence \g avec un nombre négatif
indique une référence relative. Par exemple, (foo)(bar)\g{-1}
trouvera la séquence "foobarbar" et (foo)(bar)\g{-2} trouvera
la séquence "foobarfoo". Ceci peut être pratique dans les longs masques,
comme alternative au fait de tenir le compte des sous-masques pour
référencer un sous-masque précédent particulier.
Les références arrière du sous-masque nommé peuvent être
utilisées sous la forme
(?P=name),
\k<name>, \k'name',
\k{name}, \g{name},
\g<name> ou \g'name'.