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
Libérer: 2024-10-25 02:35:02
original
506 Les gens l'ont consulté

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)))))))
Copier après la connexion

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 :

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

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 :

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

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