Maison >interface Web >js tutoriel >Comment puis-je trouver des correspondances qui se chevauchent dans une chaîne à l'aide d'expressions régulières ?
Comprendre la correspondance de chaînes qui se chevauchent avec Regex
Dans certains scénarios, la méthode string#match avec l'indicateur global peut ne pas correspondre aux séquences qui se chevauchent dans le chaîne d'entrée. Par exemple, considérons la chaîne « 12345 ». En utilisant l'expression régulière /d{3}/g, nous espérons obtenir trois correspondances : ["123", "234", "345"]. Cependant, nous n'obtenons qu'une seule correspondance, "123".
Cela est dû au fait que la méthode string#match consomme (c'est-à-dire lit et avance son index au-delà) les caractères correspondants. Ainsi, après avoir fait correspondre « 123 », l'index actuel pointe vers « 4 » et le moteur d'expression régulière s'arrête, ne laissant plus aucune correspondance à trouver.
Résoudre les correspondances qui se chevauchent avec une assertion de largeur nulle
Pour remédier à cette limitation, une technique populaire consiste à utiliser une assertion prospective positive avec un groupe de capture. Cette approche affirme la présence d'une sous-chaîne sans la consommer réellement. En testant à plusieurs reprises toutes les positions dans la chaîne d'entrée, nous pouvons capturer les correspondances qui se chevauchent souhaitées.
var re = /(?=(\d{3}))/g; console.log(Array.from('12345'.matchAll(re), x => x[1]);
Dans cet exemple, nous créons une expression régulière avec une assertion anticipée positive qui capture trois chiffres consécutifs sans les consommer. En parcourant la chaîne d'entrée à l'aide de matchAll, nous obtenons la liste de correspondances souhaitée : ["123", "234", "345"].
Cette technique est prise en charge dans divers langages de programmation, permettant aux développeurs de gérer superposer facilement les scénarios de correspondance de chaînes.
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!