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
Libérer: 2024-12-19 17:50:13
original
902 Les gens l'ont consulté

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);
Copier après la connexion

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"]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal