Maison >interface Web >js tutoriel >Pourquoi la méthode `match()` de JavaScript trouve-t-elle uniquement les correspondances d'expressions régulières qui ne se chevauchent pas ?

Pourquoi la méthode `match()` de JavaScript trouve-t-elle uniquement les correspondances d'expressions régulières qui ne se chevauchent pas ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 17:50:13903parcourir

Why Does JavaScript's `match()` Method Only Find Non-Overlapping Regular Expression Matches?

Correspondances superposées dans les expressions régulières

Dans les expressions régulières, la méthode match avec l'indicateur g (global) correspond et capture généralement uniquement les sous-chaînes qui ne se chevauchent pas. Prenons l'exemple suivant :

const text = "12345";
const regex = /\d{3}/g;
const matches = text.match(regex);

Dans ce cas, nous nous attendrions à obtenir trois correspondances : "123", "234" et "345". Cependant, en utilisant la méthode match, nous obtenons uniquement "123".

Pourquoi une seule correspondance ?

La méthode match consomme la sous-chaîne correspondante et avance son index. Après avoir capturé "123", l'index dépasse désormais le troisième caractère, ne laissant que "45" pour une correspondance potentielle. Étant donné que cette partie restante ne répond pas au modèle d{3}, aucune autre correspondance n'est trouvée.

Résolution des correspondances qui se chevauchent

Pour capturer les correspondances qui se chevauchent, nous devons utiliser une technique différente utilisée dans certains versions d'expressions régulières telles que .Net, Python, PHP et Ruby. Cette technique implique l'utilisation d'une assertion de largeur nulle (anticipation positive avec un groupe de capture) pour tester toutes les positions dans la chaîne d'entrée. La propriété RegExp.lastIndex est incrémentée manuellement pour avancer dans la chaîne sans boucle infinie.

Par exemple, en utilisant la méthode matchAll :

const re = /(?=(\d{3}))/g;
const matches = Array.from('12345'.matchAll(re));
console.log(matches.map(match => match[1])); // ["123", "234", "345"]

Cette approche capture les trois correspondances qui se chevauchent comme vous le souhaitez. N'oubliez pas que la technique n'est prise en charge que dans certaines versions d'expressions régulières.

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