Expressions régulières et parenthèses équilibrées : un match difficile
Les expressions régulières sont des outils puissants, mais faire correspondre des parenthèses parfaitement équilibrées présente un obstacle important. Alors que les expressions régulières de base peuvent gérer des cas simples, les structures imbriquées complexes nécessitent des techniques plus sophistiquées. Explorons ce défi et une solution utilisant des fonctionnalités avancées d'expression régulière.
Considérez cette première tentative :
<code>func([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)</code>
Cette expression régulière vise à faire correspondre un appel de fonction, mais elle ne parvient pas à identifier avec précision uniquement les parenthèses équilibrées. Il capture toutes les parenthèses rencontrées, quelle que soit l'imbrication appropriée.
Pour surmonter cette limitation, nous devons exploiter des fonctionnalités telles que les groupes sans capture, les assertions anticipées et les analyses anticipées. Ceux-ci permettent une correspondance conditionnelle et une validation de modèle en fonction du contexte.
Une solution regex raffinée :
<code>func([a-zA-Z_][a-zA-Z0-9_]*) # Function name \( # Opening parenthesis (?: # Non-capturing group [^()] # Match any character except parentheses | (?<open> \( ) # Match opening parenthesis, add to 'open' stack | (?<-open> \) ) # Match closing parenthesis, remove from 'open' stack )+ (?(open)(?!)) # Fails if 'open' stack is not empty \) # Closing parenthesis</code>
Cette expression améliorée utilise un mécanisme de groupe d’équilibrage. Les constructions (?<open> ( )
et (?<-open> ) )
gèrent une pile. Chaque parenthèse ouvrante s'ajoute à la pile et chaque parenthèse fermante en supprime une. L'assertion finale (?(open)(?!))
garantit que la correspondance échoue si la pile n'est pas vide à la fin, garantissant ainsi des parenthèses équilibrées. Cette approche gère efficacement les structures imbriquées.
Par conséquent, en employant stratégiquement des capacités avancées d'expression régulière, nous pouvons construire des expressions capables d'identifier et de faire correspondre avec précision les structures de parenthèses équilibrées.
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!