Maison >Java >javaDidacticiel >Comment faire correspondre les supports imbriqués sans récursion ni groupes d'équilibrage ?

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

DDD
DDDoriginal
2024-10-25 02:35:02462parcourir

How to Match Nested Brackets Without Recursion or Balancing Groups?

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

Défi :

Faire correspondre un ensemble de des crochets arbitrairement imbriqués à l'aide d'une version d'expression régulière qui ne prend pas en charge la récursivité et les groupes d'équilibrage, comme java.util.regex de Java, capturant trois groupes externes dans la chaîne donnée :

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))

Solution : transmettre les références à the Rescue

Contrairement à la croyance populaire, faire correspondre les parenthèses imbriquées sans ces fonctionnalités avancées est possible en utilisant des références avancées :

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

Décomposer :

Cette regex complexe fonctionne en deux étapes :

  • Étape 1 : Les Lookaheads identifient des séquences de parenthèses équilibrées sans consommer de caractères. Ce processus se poursuit jusqu'à ce qu'un groupe externe complet soit trouvé.
  • Étape 2 : Un groupe de capture extrait le contenu du groupe externe correspondant.

Comment ça marche :

  • Vérification de '(' : Avancez dans la chaîne jusqu'à ce qu'un '(' soit rencontré.
  • Correspondance Parenthèses équilibrées : Utilisez deux analyses anticipées pour vous assurer que les prochains '(' et ')' correspondent de manière équilibrée, en capturant le contenu interne.
  • Vérification des parenthèses de fermeture : Vérifiez un ')' de fermeture qui correspond au '(' précédemment correspondant et avancez plus loin.
  • Vérification de fin de groupe externe : Assurez-vous qu'aucun autre '(' n'apparaisse avant le 'de fermeture' )' du groupe externe.

Variante de correspondance de groupe interne :

Pour faire correspondre les groupes internes, la stratégie reste la même, mais un groupe de capture est utilisé pour enregistrer le contenu correspondant dans une paire de parenthèses équilibrées :

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

Rupture complète :

Un tableau résume les composants et les fonctionnalités de l'expression régulière :

Note Component Description
(?=() Look for '('
(?: Start group for iteration
(?=.?((?!.?1)) Look for '(' not followed by 1, which contains the matched inner content
(.)(?!.2).*)) Capture inner content and check for at least one more ')'
(?=.?)(?!.?3)) Look for ')' not followed by 2, which contains the matched outer content
(. ) Capture outer content
. Consume a character
) Close group
? Match as few times as possible
.*?(?=1) Match up to and including the last '('
1*(?=2$) Match up to the last ')' without encountering more '('

  1. (

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