Maison > Java > javaDidacticiel > le corps du texte

Comment faire correspondre les supports imbriqués sans récursion ni groupes d'équilibrage dans Regex ?

Susan Sarandon
Libérer: 2024-10-24 11:59:02
original
934 Les gens l'ont consulté

How to Match Nested Brackets Without Recursion or Balancing Groups in Regex?

Faire correspondre les supports imbriqués sans récursion ni groupes d'équilibrage

Le problème de faire correspondre les supports imbriqués sans récursion ni groupes d'équilibrage se pose lors de l'utilisation de saveurs d'expression régulière qui manquent ces fonctionnalités. Cette tâche présente un défi unique, car les expressions régulières ne sont généralement pas bien adaptées à la gestion des structures imbriquées.

Résoudre le casse-tête à l'aide de références avancées

Une solution à ce problème implique l'utilisation de références directes pour capturer des sous-chaînes entre parenthèses imbriquées. L'expression régulière suivante accomplit cela :

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Copier après la connexion

Décomposer l'expression

Cette expression complexe se compose de plusieurs composants qui fonctionnent ensemble pour faire correspondre des groupes de parenthèses imbriqués :

  • Avis positif pour la parenthèse ouvrante : (?=(). Cela correspond et consomme un '(' uniquement s'il existe.
  • Itération de groupe : (?:...) ?. Ce groupe parcourt la chaîne, correspondant à plusieurs groupes équilibrés.
  • Identification des parenthèses ouvrantes imbriquées : (?=.*?((? !.*?1). Cela correspond à l'occurrence suivante de '(' qui n'est pas précédée de la sous-chaîne capturée 1, garantissant que nous ne correspondons pas à nouveau au même '('.
  • Capture Sous-chaîne entre crochets : (.*)(?!.*2).*. Ceci capture la partie de la chaîne entre le '(' et le ')' correspondant qui n'est pas suivi par la sous-chaîne capturée 2.
  • Identification des parenthèses fermantes imbriquées : (?=.*?)(?!.*?2). Cela correspond à l'occurrence suivante de ')' qui n'est pas précédée de la sous-chaîne capturée. 2, garantissant encore une fois une correspondance non redondante.
  • Capture du reste de la sous-chaîne : (.*). Cela capture la partie restante de la chaîne après le ')' correspondant et avant le prochain '(' ou la fin de la chaîne.
  • Caractères correspondants et consommateurs : . Cela consomme un seul caractère , permettant au groupe de continuer la correspondance.
  • Validation finale : .*?(?=1)[^(]*(?=2$). Cela vérifie et valide que le dernier Les correspondances '(' et ')' forment un groupe équilibré.

En utilisant ces composants, l'expression fait correspondre des groupes de parenthèses imbriquées à chaque itération jusqu'à ce que la fin de la chaîne soit atteinte.

Remarque supplémentaire

La solution fournie ici est conçue pour les versions d'expression régulière qui prennent en charge les références avancées. Pour les versions qui ne le font pas, comme JavaScript, cette technique ne peut pas être appliquée directement.

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
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
À 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!