Maison >développement back-end >C++ >Comment pouvons-nous améliorer les expressions régulières pour détecter de manière fiable les boucles C For et While se terminant par des points-virgules ?

Comment pouvons-nous améliorer les expressions régulières pour détecter de manière fiable les boucles C For et While se terminant par des points-virgules ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-15 03:41:13473parcourir

How Can We Improve Regular Expressions to Reliably Detect C   For and While Loops Ending with Semicolons?

Amélioration de l'expression régulière pour la détection de boucle C avec un point-virgule

Introduction

La question d'origine cherchait une expression régulière pour identifier les boucles C for ou while se terminant par un point-virgule. Une solution proposée utilisait des groupes de capture nommés, mais rencontrait des difficultés lorsque les appels de fonction étaient inclus dans la troisième expression de la boucle.

Expression régulière améliorée

Pour résoudre ce problème, une approche alternative a été développée :

# match any line that begins with a "for" or "while" statement:
REGEX_STR = r"^\s*(for|while)\s*\("

# match a balanced substring, accounting for function calls within expressions:
SUB_STR_PATTERN = r"([^\(\)]|(\([^\(\)]*(?:\|\|[^()\s]*(?1))*?\)))"

# match a balanced string of arbitrary length, including function calls:
SUB_STR_GROUP = f"(?P<balanced>{SUB_STR_PATTERN})+"

# match the initial opening parenthesis, followed by balanced expressions, and finally the closing parenthesis.
REGEX_STR += f"{SUB_STR_GROUP}\)\s*;\s*"

# compile the regex object with MULTILINE and VERBOSE flags for readability
REGEX_OBJ = re.compile(REGEX_STR, re.MULTILINE | re.VERBOSE)

Explication

Cette expression régulière améliorée exploite le SUB_STR_PATTERN pour définir une sous-chaîne équilibrée qui peut contiennent des appels de fonction. Le || L'opérateur est utilisé pour créer une condition OU logique, permettant au modèle de correspondre soit à des caractères non parenthèses, soit à des chaînes équilibrées imbriquées.

En répétant ce modèle dans le SUB_STR_GROUP, l'expression régulière garantit qu'elle peut correspondre à une séquence de caractères équilibrés. expressions régulières, quel que soit leur niveau d'imbrication.

Conclusion

Cette expression régulière améliorée fournit une solution plus robuste pour détecter les expressions C Les boucles for ou while se terminent par un point-virgule, même dans les cas où des appels de fonction sont présents dans la troisième expression de la boucle. Cela simplifie la logique en éliminant le besoin de modèles récursifs.

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!

Déclaration:
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