Maison >développement back-end >C++ >Les expressions régulières peuvent-elles équilibrer efficacement les parenthèses ?
Utiliser des expressions régulières pour valider des parenthèses équilibrées
Bien que les expressions régulières soient puissantes, équilibrer parfaitement les parenthèses en utilisant uniquement des expressions régulières est intrinsèquement difficile. Cependant, nous pouvons créer une regex qui valide efficacement les parenthèses équilibrées dans un contexte spécifique. L'approche suivante démontre une méthode :
Regex pour la validation des parenthèses :
<code>func([a-zA-Z_][a-zA-Z0-9_]*) # Function name \( # Opening parenthesis (?: [^()] # 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>
Comment ça marche :
Cette expression régulière exploite les groupes d'équilibrage (disponibles dans de nombreux moteurs d'expression régulière, mais pas tous).
(?<open> ( )
et (?<-open> ) )
utilisent des groupes de capture nommés. (?<open> ...)
ajoute une parenthèse ouvrante correspondante à une pile nommée "open". (?<-open> ...)
supprime une parenthèse fermante correspondante de la pile "ouverte".(?(open)(?!))
est une expression conditionnelle. Il vérifie si la pile "ouverte" est vide. S'il n'est pas vide (parenthèses déséquilibrées), la correspondance entière échoue.Exemple :
Étant donné la chaîne d'entrée : "test -> funcPow((3),2) * (9 1)"
L'expression régulière identifie correctement "funcPow((3),2)"
comme une expression de parenthèse équilibrée. Il ne correspondra pas "funcPow((3),2) * (9 1)
car les parenthèses extérieures sont déséquilibrées.
Limites :
Cette expression régulière ne fonctionne que pour les parenthèses directement liées à un appel de fonction (tel que défini par func([a-zA-Z_][a-zA-Z0-9_]*)
). Les appels de fonctions imbriqués entre parenthèses ne sont pas gérés. Pour un équilibrage des parenthèses vraiment robuste sur des structures imbriquées complexes, une approche non basée sur les expressions régulières (comme un algorithme basé sur une pile) est généralement nécessaire.
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!