如何编写正则表达式匹配参数个数为奇数的方法调用
匹配奇数个参数的方法调用正则方案
问题复现
现有待匹配的代码片段如下:
x.method(1) x.method(1,2) x.method(1,2,3) # <- 需要匹配 x.method(1,2,3,4) x.method(1,2,3,4,5) # <- 需要匹配
原有正则.method\s?\(([^,)]*,){2}[^,)]*\)仅能固定匹配3个参数的调用,无法覆盖1、5、7等所有奇数参数的场景。
核心逻辑
参数个数为奇数时,参数之间的逗号总数一定是偶数(0、2、4……),对应结构为:1个基础参数 + N组(逗号+参数+逗号+参数),N取≥0的整数,总参数数为1+2N,恒为奇数。
可用正则
基础版(无多余空格场景)
适用于参数前后、逗号前后无额外空格的严格格式:
\.method\s?\([^,)]*(?:,[^,)]*,[^,)]*)*\)
匹配效果:
- 命中:
x.method(1)、x.method(1,2,3)、x.method(1,2,3,4,5) - 不命中:
x.method(1,2)、x.method(1,2,3,4)
兼容版(适配空格场景)
如果代码中存在参数前后、逗号前后加空格的写法(如x.method(1, 2, 3)),使用以下版本:
\.method\s?\(\s*[^,)]*\s*(?:\s*,\s*[^,)]*\s*,\s*[^,)]*\s*)*\)
原有正则问题说明
原正则中([^,)]*,){2}是固定匹配2次「参数+逗号」的结构,只能对应3个参数的固定场景,没有对「双参数追加组」做任意次重复匹配,因此无法覆盖所有奇数参数的情况。
内容的提问来源于stack exchange,提问作者xaos_xv
相关产品推荐
相关产品推荐

