Maison > interface Web > js tutoriel > Comment puis-je obtenir des correspondances qui se chevauchent avec des expressions régulières et le drapeau global ?

Comment puis-je obtenir des correspondances qui se chevauchent avec des expressions régulières et le drapeau global ?

Linda Hamilton
Libérer: 2024-12-13 02:24:16
original
546 Les gens l'ont consulté

How Can I Get Overlapping Matches with Regular Expressions and the Global Flag?

Correspondance de chaînes superposées avec des expressions régulières

Lorsque vous utilisez une expression régulière avec l'indicateur global (/g) pour faire correspondre une chaîne, vous pouvez rencontrer des cas où les correspondances qui se chevauchent ne sont pas renvoyées comme prévu. Par exemple, dans la chaîne "12345", la correspondance utilisant /d{3}/g ne donne que la correspondance "123" au lieu de ["123", "234", "345"].

La raison car ce comportement réside dans la nature de la correspondance des regex avec le drapeau global. Le moteur d'expression régulière lit et consomme la sous-chaîne correspondante, avançant son index à la position qui suit immédiatement la correspondance. Dans ce cas, après avoir fait correspondre « 123 », l'index passe à la position 4, ne laissant que « 45 » pour la correspondance ultérieure.

Techniques de correspondance par chevauchement

Pour y parvenir correspondances qui se chevauchent, plusieurs approches peuvent être utilisées :

  • Zero-Width Assertions :

    • Utilisez une anticipation positive avec un groupe de capture pour tester toutes les positions dans la chaîne d'entrée.
    • Avancez manuellement le RegExp.lastIndex pour éviter les boucles infinies.
    • Supporté par .NET, Python, PHP, Ruby et Java (en utilisant matchAll).

Exemple (JavaScript utilisant matchAll) :

const re = /(?=(\d{3}))/g;
console.log(Array.from('12345'.matchAll(re), x => x[1]));
Copier après la connexion

Ce code utilise une anticipation positive pour tester tous positions dans la chaîne qui correspondent à trois chiffres consécutifs. Le résultat est un tableau des sous-chaînes correspondantes, y compris ["123", "234", "345"].

Considérations supplémentaires :

  • Zéro Les assertions -width ne sont applicables que lorsque vous devez faire correspondre des sous-chaînes qui se chevauchent.
  • Certains moteurs d'expressions régulières ont des fonctionnalités intégrées prise en charge des correspondances qui se chevauchent (par exemple, PCRE en PHP et Ruby).
  • Des approches alternatives peuvent inclure l'utilisation de boucles avec des sous-chaînes ou des fonctions de fractionnement.

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