Faire correspondre des parenthèses imbriquées sans récursion ni groupes d'équilibrage
Faire correspondre des 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 directes.
Correspondance des groupes externes
L'expression régulière suivante [1] correspond aux groupes externes de crochets sans imposer de limites de profondeur :
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
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 terminer la correspondance.
Groupes internes correspondants
Pour inclure les groupes internes, nous pouvons capturer l'expression suivante [2] :
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
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 capturer 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 :
Composant | Description |
---|---|
(?=() | Affirme que '(' précède l'analyse complexe |
(? : | Début du groupe sans capture pour le traitement répété des chaînes |
(?= | Affirmer que le prochain '(' suit |
.?((?!.?\1) | Match jusqu'au prochain '(' non suivi du groupe 1 |
(.)(?!.\2).* | Remplissez le groupe 1 avec la chaîne, en vous assurant qu'un autre ')' existe |
) | Assurer que le ')' correspondant est valide |
.?)(?!.?\2) | Affirmer que le ')' suivant non suivi du groupe 2 existe |
(.*) | Remplir le groupe 2 avec la chaîne restante |
) | Affirmer que le ')' correspondant est valide |
Consommer un seul caractère pour continuer la correspondance dans le groupe | |
) ? | Répéter le groupe (dans la boucle interne) |
.*?(?=\ 1) | Correspondre jusqu'au dernier '(' trouvé |
1*(?=\2 $) | Faire correspondre le dernier ')' (mais au sein du groupe valide) |
Cette méthode permet une correspondance efficace des parenthèses imbriquées sans avoir besoin pour la récursivité ou l'équilibrage des groupes.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3