Maison > Java > javaDidacticiel > Les supports imbriqués peuvent-ils être mis en correspondance sans récursion ni groupes d'équilibrage ?

Les supports imbriqués peuvent-ils être mis en correspondance sans récursion ni groupes d'équilibrage ?

Patricia Arquette
Libérer: 2024-10-24 12:25:02
original
1047 Les gens l'ont consulté

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

Faire correspondre les parenthèses imbriquées sans récursion ni équilibrer les groupes

Faire correspondre les parenthèses imbriquées à l'aide d'expressions régulières peut s'avérer difficile, en particulier dans des langages comme Java, où la récursion et les groupes d’équilibrage ne sont pas pris en charge. Heureusement, il est en effet possible de surmonter cette limitation en utilisant des références avancées.

Correspondance des groupes externes

L'expression régulière suivante [1] correspond aux groupes externes de parenthèses sans imposer de limites de profondeur :

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

Ici, l'expression recherche les parenthèses ouvrantes, à l'exclusion des parenthèses ouvrantes sans correspondance, et capture les parenthèses fermantes correspondantes. Les sous-chaînes capturées, bien qu'inutiles, servent d'espaces réservés pour compléter la correspondance.

Correspondance des groupes internes

Pour inclure les groupes internes, nous pouvons capturer l'expression suivante [2] :

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

En ajoutant un groupe de capture et en ajustant les indices de référence arrière, cette expression capture également les groupes internes.

Comment ça marche

La méthode parcourt la chaîne, faisant correspondre les parenthèses ouvrantes et fermantes suivantes tout en capturant la chaîne restante dans chaque cas. Les analyses anticipées garantissent que les parenthèses correspondent de manière équilibrée.

L'expression est construite comme suit :

Component Description
(?=() Asserts that '(' precedes complex parsing
(?: Start of non-capturing group for repeated string processing
(?= Assert that the next '(' follows
.?((?!.?1) Match until the next '(' not followed by group 1
(.)(?!.2).* Fill group 1 with the string, ensuring another ')' exists
) Assert that the matching ')' is valid
.?)(?!.?2) Assert that the next ')' not followed by group 2 exists
(.*) Fill group 2 with the remaining string
) Assert that the matching ')' is valid
Consume a single character to continue matching within the group
) ? Repeat the group (in the inner loop)
.*?(?=1) Match up to and including the last '(' found
1*(?=2$) Match up to the last ')' (but within the valid group)

Cette méthode permet une correspondance efficace des parenthèses imbriquées sans avoir besoin de récursion ou de groupes d'équilibrage.


  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!

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