Maison  >  Article  >  interface Web  >  Comment capturer plusieurs groupes dans une expression rationnelle JavaScript lorsque la répétition ne conserve que la dernière correspondance ?

Comment capturer plusieurs groupes dans une expression rationnelle JavaScript lorsque la répétition ne conserve que la dernière correspondance ?

DDD
DDDoriginal
2024-11-16 22:40:03650parcourir

How can you capture multiple groups in a JavaScript regexp when the repetition only keeps the last match?

Capturer plusieurs groupes dans JavaScript Regexp

Lorsque vous travaillez avec des expressions régulières en JavaScript, il est possible de capturer plusieurs groupes de correspondances dans une chaîne . Cependant, il existe des limites au nombre de groupes qui peuvent être capturés et récupérés.

Considérez l'expression rationnelle JavaScript suivante :

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

On pourrait s'attendre à ce que cette expression rationnelle renvoie un tableau contenant l'intégralité de chaîne "foo bar baz" ainsi que chaque mot individuel :

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

Cependant, l'expression rationnelle renvoie en fait uniquement la dernière correspondance capturée :

["foo bar baz", " baz"]

Ce comportement se produit car, dans la plupart Avec les saveurs d'expression rationnelle, seule la dernière capture d'un groupe de capture répété est conservée. En JavaScript, la répétition d'un groupe de capture permet uniquement de capturer exactement le nombre spécifié de chaînes par correspondance.

Pour surmonter cette limitation, il existe plusieurs options :

  • Fractionnement sur les délimiteurs : Si possible, envisagez de diviser la chaîne sur le délimiteur approprié au lieu d'utiliser une expression rationnelle avec des groupes de capture répétés.
  • Utilisation d'une boucle d'exécution globale : Faites correspondre le groupe répété en une seule correspondance en utilisant l'indicateur /pattern/g, puis traitez les résultats à l'aide d'une boucle d'exécution. Notez que cette méthode n'est pas entièrement équivalente à un groupe de capture répétée.
  • Correspondance à plusieurs niveaux : Capturez le groupe répété en une seule correspondance, puis utilisez une deuxième expression rationnelle pour séparer cette correspondance.

Exemple :

Pour faire correspondre la chaîne dans un texte utilisant la correspondance à plusieurs niveaux :

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) {
  print(match[1].split(";"));
}

Cette approche utilise deux niveaux de correspondance pour extraire des mots individuels de la chaîne.

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