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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 02:37:02437parcourir

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 :

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)

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)))))))

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

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))

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!

Déclaration:
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