Maison >interface Web >js tutoriel >Pourquoi JavaScript Regex capture-t-il uniquement le dernier groupe d'une répétition ?

Pourquoi JavaScript Regex capture-t-il uniquement le dernier groupe d'une répétition ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-11 04:12:02313parcourir

Why Does JavaScript Regex Capture Only the Last Group in a Repetition?

Capturer plusieurs groupes dans des expressions régulières JavaScript

Lorsque vous travaillez avec des expressions régulières en JavaScript, il est courant de rencontrer des situations dans lesquelles vous devez capturer plusieurs groupes de données. Cependant, dans certains cas, le comportement attendu de capture de tous les groupes correspondants peut ne pas être obtenu.

Par exemple, considérons le code JavaScript suivant :

"foo bar baz".match(/^(\s*\w+)+$/)

Vous pouvez vous attendre à ce que le code renvoie un tableau contenant toutes les correspondances capturées :

["foo bar baz", "foo", " bar", " baz"]

Cependant, le résultat réel est :

["foo bar baz", " baz"]

Cela se produit car en mode régulier expressions, lorsque vous répétez un groupe de capture, seule la dernière capture est conservée. Il s'agit du comportement par défaut dans la plupart des versions d'expression régulière.

Solutions de contournement pour capturer toutes les correspondances

Si vous devez capturer tous les groupes correspondants, quelques options sont disponibles :

  • Diviser sur les délimiteurs : Si le motif que vous essayez de faire correspondre contient des délimiteurs, pensez à utiliser la méthode split au lieu d'une expression régulière. Cette approche peut être utilisée pour diviser la chaîne d'entrée en un tableau de chaînes.
  • Correspondance à l'aide d'une boucle : Vous pouvez utiliser une boucle pour appliquer à plusieurs reprises l'expression régulière à la chaîne d'entrée à l'aide du méthode d'exécution. Cette méthode renvoie un tableau contenant tous les groupes capturés pour chaque correspondance.
  • Correspondance à plusieurs niveaux : Une autre approche consiste à capturer le groupe répété dans une correspondance, puis à utiliser une deuxième expression régulière pour rompre cela match apart.

Exemple d'utilisation d'une boucle d'exécution

L'exemple suivant montre la correspondance de plusieurs groupes à l'aide d'une boucle d'exécution :

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  console.log(match[1].split(";"));
}
// [ 'c', 'd', 'e', 'f' ]
// [ 'xx', 'yy', 'zz' ]

Ressources supplémentaires

  • regular-expressions.info/Répéter un groupe de capture vs capturer un groupe répétitif
  • Comment accéder aux groupes correspondants dans une regex javascript ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn