如何使用单条正则表达式提取函数调用中的各参数
问题描述
待解析的函数调用代码片段如下:
Foo(int n, str b, Bar1(), Bar2(smth));
需要通过正则直接提取函数的所有入参,预期匹配结果:
int n str b Bar1() Bar2(smth) // 不需要递归处理嵌套括号内的内容
当前已实现的分步方案:
- 第一步:用正则
(?<=\().*(?=\))匹配函数圆括号包裹的完整参数字符串,得到int n, str b, Bar1(), Bar2(smth) - 第二步:对上述提取出的字符串,再用正则
[^,\s*][a-zA-Z\s<>.()0-9]*匹配拆分,得到每个独立参数
疑问:是否可以通过单条正则完成上述提取,也就是先匹配到括号内的参数整体,再直接对这个分组应用拆分匹配规则?
解决方案
完全可以用单条全局正则实现,不需要分步处理,核心是通过边界断言定位每个参数的起止位置,跳过括号和逗号分隔符,不需要先抓整体再二次匹配。
直接可用的正则(需要开启全局匹配模式g):
(?:\(|,)\s*([a-zA-Z_][a-zA-Z0-9_\s<>.()]*)(?=\s*[,)])
各部分逻辑说明:
(?:\(|,)\s*:非捕获匹配参数的前边界,匹配函数左括号(或者参数间的逗号,,同时跳过后面跟着的任意空白字符([a-zA-Z_][a-zA-Z0-9_\s<>.()]*):第一个捕获组就是需要的单个参数内容,兼容普通类型参数、带括号的函数调用式参数、带泛型尖括号的参数,修正了原分步正则中起始字符匹配可能误抓非法字符的问题(?=\s*[,)]):正向预查校验参数后边界,参数后方允许存在任意空白,之后必须是分隔逗号或者函数右括号,避免把参数截断或者匹配到多余内容
使用时每次全局匹配取捕获组1的内容即可,针对给出的示例代码,四次匹配的结果分别为int n、str b、Bar1()、Bar2(smth),完全符合预期,且不需要递归处理嵌套,正好匹配需求。
内容的提问来源于stack exchange,提问作者Chebz
相关产品推荐
相关产品推荐

