Comment puis-je obtenir la fonctionnalité des assertions lookbehind de longueur variable dans les expressions régulières sans elles ?

DDD
Libérer: 2024-10-31 22:07:02
original
143 Les gens l'ont consulté

How can I achieve the functionality of variable-length lookbehind assertions in regular expressions without them?

Alternatives aux assertions Lookbehind de longueur variable pour les expressions régulières

Les assertions Lookbehind de longueur variable, telles que /(?<!foo.*)bar/, autorisent vous devez faire correspondre un modèle si une certaine condition est remplie pour un nombre variable de caractères précédant le modèle. Bien que certaines implémentations d'expressions régulières, telles que le module regex en Python, prennent en charge les assertions lookbehind de longueur variable, il existe des alternatives qui peuvent être utilisées dans d'autres implémentations.

K : tuer les personnages capturés

One Une alternative aux assertions lookbehind de longueur variable est le caractère K. K marque un point dans l'expression régulière où les correspondances suivantes ne doivent pas être considérées comme faisant partie de la chaîne capturée finale. Par exemple, l'expression régulière suivante :

s/unchanged-part\Kchanged-part/new-part/x
Copier après la connexion

Faire correspondre la sous-chaîne "changed-part" dans la chaîne "unchanged-partchanged-part" et la remplacer par "new-part". Cependant, la partie « partie inchangée » de la chaîne ne serait pas incluse dans le remplacement.

Lookbehinds négatifs comme approximation

Alors que K peut être utilisé pour approximer les assertions lookbehind de longueur variable dans correspondant, ce n’est pas aussi flexible. Par exemple, il n'existe pas d'équivalent à une assertion d'analyse négative utilisant K.

Une assertion d'analyse négative correspond à un modèle si une certaine condition n'est pas remplie pour un nombre variable de caractères précédant le modèle. L'expression régulière suivante utilise une assertion lookbehind négative pour faire correspondre la chaîne "bar" uniquement si elle n'est pas précédée de "foo":

/(?<!foo.*)bar/
Copier après la connexion

Une approximation de cette expression sans utiliser d'assertions lookbehind de longueur variable peut être écrit comme :

s/^(?:(?!foo).)*\Kbar/moo/s;
Copier après la connexion

Implémentations d'expressions régulières améliorées

Bien que les implémentations d'expressions régulières standard en Perl, Ruby, JavaScript et PHP ne prennent pas en charge les assertions lookbehind de longueur variable, il existe des assertions régulières améliorées Implémentations d'expressions disponibles pour chacun de ces langages :

  • Perl : Le module pcre prend en charge les assertions lookbehind de longueur variable.
  • Ruby : La gemme rexml prend en charge les assertions lookbehind de longueur variable.
  • JavaScript : La bibliothèque js-regex prend en charge les assertions lookbehind de longueur variable.
  • PHP : La bibliothèque pcre prend en charge les assertions lookbehind de longueur variable.

Ces implémentations améliorées d'expressions régulières offrent des fonctionnalités et des optimisations supplémentaires, notamment la prise en charge des assertions lookbehind de longueur variable.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!