JavaScript Groupes RegExp


Exemple

JavaScript prend en charge plusieurs types de groupes dans ses expressions régulières, groupes de capture, groupes de non-capture et anticipations . À l' heure actuelle, il n'y a pas de support regarder en arrière.

Capturer

Parfois, la correspondance souhaitée dépend de son contexte. Cela signifie qu'un RegExp simple trouvera le morceau de la chaîne qui présente un intérêt, la solution est donc d'écrire un groupe de capture (pattern) . Les données capturées peuvent alors être référencées comme ...

  • Remplacement de chaîne "$n"n est le nième groupe de capture (à partir de 1 )
  • Le n ème argument dans une fonction de rappel
  • Si le RegExp n'est pas marqué g , le n + 1 ème élément d'un tableau str.match renvoyé
  • Si RegExp est marqué g , str.match ignore les captures, utilise plutôt re.exec

Disons qu'il y a une chaîne où tous les signes + doivent être remplacés par un espace, mais seulement s'ils suivent un caractère de lettre. Cela signifie qu'un simple match inclura ce caractère de lettre et qu'il sera également supprimé. La capture est la solution car cela signifie que la lettre correspondante peut être préservée.

let str = "aa+b+cc+1+2",
    re = /([a-z])\+/g;

// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"

Non-capture

En utilisant le formulaire (?:pattern) , ceux-ci fonctionnent de la même manière que pour capturer des groupes, sauf qu'ils ne stockent pas le contenu du groupe après la correspondance.

Ils peuvent être particulièrement utiles si d’autres données sont en cours de capture et que vous ne souhaitez pas déplacer les index, mais que vous devez effectuer une correspondance de modèle avancée, par exemple un OU

let str = "aa+b+cc+1+2",
    re = /(?:\b|c)([a-z])\+/g;

str.replace(re, '$1 '); // "aa+b c 1+2"

Look-Ahead

Si la correspondance souhaitée repose sur quelque chose qui la suit, plutôt que de la faire correspondre et de la capturer, il est possible de l'utiliser pour la tester, mais ne pas l'inclure dans la correspondance. Une anticipation positive a la forme (?=pattern) , une anticipation négative (où l'expression ne se produit que si le modèle d'anticipation ne correspond pas) a la forme (?!pattern)

let str = "aa+b+cc+1+2",
    re = /\+(?=[a-z])/g;

str.replace(re, ' '); // "aa b cc+1+2"