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 :
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
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] :
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
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.
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!