Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Assertion de précédence : (?<=...), (?<!...)

Baseline
Large disponibilité

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis mars 2023.

Une assertion de précédence « regard en arrière » (lookbehind assertion en anglais) : elle tente de faire correspondre l'entrée précédente avec le modèle donné, mais elle ne consomme aucune partie de l'entrée — si la correspondance réussit, la position actuelle dans l'entrée reste la même. Elle fait correspondre chaque atome de son modèle dans l'ordre inverse.

Syntaxe

regex
(?<=pattern)
(?<!pattern)

Paramètres

pattern

Un motif constitué de tout ce que vous pouvez utiliser dans un littéral d'expression rationnelle, y compris une disjonction.

Description

Une expression rationnelle correspond généralement de gauche à droite. C'est pourquoi les assertions anticipées et de précédence sont appelées ainsi — l'anticipation vérifie ce qui se trouve à droite, et la précédence vérifie ce qui se trouve à gauche.

Pour qu'une assertion (?<=pattern) réussisse, le pattern doit correspondre à l'entrée immédiatement à gauche de la position actuelle, mais la position actuelle n'est pas modifiée avant de faire correspondre l'entrée suivante. La forme (?<!pattern) nie l'assertion — elle réussit si le pattern ne correspond pas à l'entrée immédiatement à gauche de la position actuelle.

La précédence a généralement la même sémantique que l'anticipation — cependant, dans une assertion de précédence, l'expression rationnelle correspond en arrière. Par exemple,

js
/(?<=([ab]+)([bc]+))$/.exec("abc"); // ['', 'a', 'bc']
// Pas ['', 'ab', 'c']

Si la précédence correspond de gauche à droite, elle doit d'abord correspondre avidement à [ab]+, ce qui fait que le premier groupe capture "ab", et le reste "c" est capturé par [bc]+. Cependant, comme [bc]+ est d'abord mis en correspondance, il saisit avidement "bc", ne laissant que "a" pour [ab]+.

Ce comportement est logique — le moteur de correspondance ne sait pas où commencer la correspondance (car la précédence peut ne pas avoir une longueur fixe), mais il sait où terminer (à la position actuelle). Par conséquent, il commence à partir de la position actuelle et travaille en arrière. (Les expressions rationnelles dans certains autres langages interdisent la précédence de longueur non fixe pour éviter ce problème.)

Pour les groupes capturant quantifiés à l'intérieur de la précédence, la correspondance la plus à gauche de la chaîne de caractères d'entrée — au lieu de celle à droite — est capturée en raison de la correspondance en arrière. Voir la page des groupes capturant pour plus d'informations. Les rétro-références à l'intérieur de la précédence doivent apparaître sur la gauche du groupe auquel elles se réfèrent, également en raison de la correspondance en arrière. Cependant, les disjonctions sont toujours tentées de gauche à droite.

Exemples

Faire correspondre des chaînes de caractères sans les consommer

De manière similaire aux assertions anticipées, les assertions de précédence peuvent être utilisées pour faire correspondre des chaînes de caractères sans les consommer, de sorte que seules les informations utiles soient extraites. Par exemple, l'expression rationnelle suivante correspond au nombre dans une étiquette de prix :

js
function obtenirPrix(etiquette) {
  return /(?<=\$)\d+(?:\.\d*)?/.exec(etiquette)?.[0];
}

obtenirPrix("$10.53"); // "10.53"
obtenirPrix("10.53"); // undefined

Un effet similaire peut être obtenu en capturant la sous-correspondance qui vous intéresse.

Spécifications

Spécification
ECMAScript® 2027 Language Specification
# prod-Assertion

Compatibilité des navigateurs

Voir aussi