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.
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)
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.
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!