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".
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.
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!