Assertions
Les assertions indiquent les conditions selon lesquelles il est possible d'avoir une correspondance (contenu situé avant la correspondance, situé après ou expressions conditionnelles).
Types
Note :
Le caractère ?
peut également être utilisé comme quantificateur.
Caractères | Signification |
---|---|
x(?=y) |
Correspond à 'x' seulement s'il est suivi de 'y'. On appelle cela un test de succession (lookahead).
Ainsi, |
x(?!y) |
Correspond à 'x' seulement si 'x' n'est pas suivi de 'y'.
Ainsi, |
(?<=y)x |
Correspond à
Ainsi / |
(?<!y)x |
Correspond à
Ainsi, |
Exemples
Assertion avant (lookahead)
let regex = /Premier(?= test)/g;
console.log("Premier test".match(regex)); // [ 'Premier' ]
console.log("Premier truc".match(regex)); // null
console.log("Voici le Premier test de l'année.".match(regex)); // [ 'Premier' ]
console.log("Voici le Premier truc du mois.".match(regex)); // null
Assertion avant négative
L'expression rationnelle /\d+(?!\.)/
permettra de rechercher plusieurs chiffres si ceux-ci ne sont pas suivis d'un point décimal. Ainsi, /\d+(?!\.)/.exec('3.141')
trouvera la sous-chaîne "141" mais pas "3."
console.log(/\d+(?!\.)/g.exec("3.141")); // [ '141', index: 2, input: '3.141' ]
Signification différente de '?!'
entre les assertions et les intervalles
La combinaison de caractères ?!
a un sens différent entre les assertions /x(?!y)/
et les intervalles [^?!]
.
let orangePasCitron =
"Voulez-vous avoir une orange? Oui, je ne veux pas avoir de citron!";
let choixPasCitron = /[^?!]+avoir(?! un citron)[^?!]+[?!]/gi;
console.log(orangePasCitron.match(choixPasCitron)); // [ 'Voulez-vous avoir une orange?' ]
let choixPasOrange = /[^?!]+avoir(?! une orange)[^?!]+[?!]/gi;
console.log(orangePasCitron.match(choixPasOrange)); // [ 'Oui, je ne veux pas avoir de citron!' ]
Assertion arrière (lookbehind)
let oranges = ["espèce orange A ", "sorte orange B", "espèce orange C"];
let especesOranges = oranges.filter((fruit) =>
fruit.match(/(?<=espèce )orange/),
);
console.log(especesOranges); // [ 'espèce orange A ', 'espèce orange C' ]