原始问题寻求一个正则表达式来识别 C for 或 while 循环一个分号。提出的解决方案利用命名捕获组,但在循环的第三个表达式中包含函数调用时遇到了挑战。
为了解决此问题,开发了一种替代方法:
# 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)
此增强型正则表达式利用 SUB_STR_PATTERN 来定义可以包含函数调用的平衡子字符串。 ||运算符用于创建逻辑 OR 条件,允许模式匹配非括号字符或嵌套平衡字符串。
通过在 SUB_STR_GROUP 内重复此模式,正则表达式确保它可以匹配平衡序列表达式,无论其嵌套级别如何。
这种改进的正则表达式为检测 C 提供了更强大的解决方案或 while 循环以分号终止,即使在循环的第三个表达式中存在函数调用的情况下也是如此。它消除了对递归模式的需要,从而简化了逻辑。
以上是我们如何改进正则表达式以可靠地检测以分号结尾的 C for 和 While 循环?的详细内容。更多信息请关注PHP中文网其他相关文章!