You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用单条正则表达式提取函数调用中的各参数

问题描述

待解析的函数调用代码片段如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:54:38