如何使用正则表达式识别缺少参数名的函数声明并排除无关匹配
函数声明匹配逻辑优化方案
原有逻辑问题
原来的正则r'[ a-zA-Z_0-9]+\(([^\)]*)\)(\.[^\)]*\))?'未限定C函数声明的语法特征,只要是带括号的文本都会被命中,才会出现日期类内容误匹配的问题。
优化思路
- 第一步:严格匹配C函数声明的结构,过滤无关文本
C函数声明的固定结构为:返回值修饰符+返回类型 函数名(参数列表);,需要先按这个规则做第一层过滤,排除普通文本:- 返回类型:支持
const/volatile修饰、类型名、指针符号*、空格 - 函数名:符合C标识符规则(字母/下划线开头,后续可接字母/数字/下划线)
- 结尾带分号(排除函数定义、普通括号文本)
- 返回类型:支持
- 第二步:识别不完整参数的声明
参数列表中每个无名称的参数项仅包含类型信息,不存在第二个符合标识符规则的名称,以此区分完整和不完整声明。
优化后代码
import re lineNum = 0 # 第一层正则:匹配合法的C函数声明 func_pattern = re.compile(r'^\s*(?:const\s+|volatile\s+)?[a-zA-Z_][a-zA-Z0-9_]*\s*\*?\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)\s*;') # 第二层正则:匹配单个无参数名的参数项(仅含类型、修饰符、指针,无标识符) no_name_param_pattern = re.compile(r'^\s*(?:const\s+|volatile\s+)?[a-zA-Z_][a-zA-Z0-9_]*\s*\*?\s*$') for element in codeStringlist: lineNum += 1 func_match = func_pattern.match(element) if not func_match: continue func_name = func_match.group(1) param_str = func_match.group(2).strip() # 空参数/void参数的情况可根据需求调整判定规则 if not param_str or param_str.lower() == 'void': continue # 拆分参数逐个校验 params = [p.strip() for p in param_str.split(',')] # 只要有一个参数没有名称,就判定为不完整声明 has_unnamed_param = any(no_name_param_pattern.fullmatch(p) for p in params) if has_unnamed_param: print(f"line: {lineNum}\t 不完整函数声明: {func_match.group(0)}")
匹配验证
- 可命中负例:
uint8_t calculateCircumference(uint8_t, float*); - 不会命中正例:
uint8_t calculateCircumference(uint8_t radius, float* circumference); - 不会命中无关文本:
0200 (Mi, 19 Mai 2021)
内容的提问来源于stack exchange,提问作者moonfungus
相关产品推荐
相关产品推荐

