Maison > Java > javaDidacticiel > le corps du texte

Regex peut-il faire correspondre les supports imbriqués sans récursion ni groupes d'équilibrage ?

Patricia Arquette
Libérer: 2024-10-25 02:37:02
original
437 Les gens l'ont consulté

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

Faire correspondre les supports imbriqués sans récursion ni équilibrer les groupes

Le défi :
Les expressions regex, telles que ceux du java.util.regex de Java correspondent-ils à des parenthèses arbitrairement imbriquées sans compter sur la récursivité ou les groupes d'équilibrage ?

La solution :
Oui, c'est possible en utilisant des références avancées :

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

Comment ça marche :
Cette expression se compose de plusieurs anticipations et références prospectives qui fonctionnent ensemble pour identifier des groupes de parenthèses imbriqués :

  • (? =() garantit que le caractère suivant est une parenthèse ouvrante.
  • (?:...) ?.*?(?=...) : Un groupe sans capture qui parcourt la chaîne.
  • (?=.*?((?!.*?1) : recherche anticipée pour trouver la prochaine parenthèse ouvrante qui ne fait pas partie du groupe déjà correspondant (capturé en 1).
  • (.*)(?!.*2).*) : capture le reste de la chaîne et correspond à au moins une parenthèse fermante supplémentaire.
  • (?=.*?)(?!.*?2 ) : Recherche anticipée pour trouver la prochaine parenthèse fermante qui ne fait pas partie du groupe déjà correspondant (capturé en 2).
  • .*?(?=1) : Correspond jusqu'à et y compris la dernière parenthèse ouvrante trouvée .
  • [^(]*(?=2$) : correspond jusqu'à la dernière parenthèse fermante trouvée, garantissant qu'il n'y a plus de parenthèses ouvrantes entre elles.

Exemple :
La chaîne suivante correspondra à trois groupes imbriqués :

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
Copier après la connexion

Correspondance des groupes internes :
Pour faire correspondre les groupes internes, un groupe de capture peut être ajouté jusqu'à la fin de l'expression :

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

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!