Go正则不使用环视如何匹配参数含AnotherClass的MyClass实例
需求说明
匹配所有将AnotherClass作为参数传入的MyClass实例,约束如下:
- 仅使用Go原生正则,不支持前瞻/后顾环视功能
- 不引入第三方库
- 最终目标为获取参数不含
AnotherClass的MyClass实例反向集合,当前优先实现正向匹配逻辑
测试用例
# case 0 return new MyClass(constructor, options, ...); # case 1 var mc = new MyClass(); # case 2 var mc = new MyClass(new AnotherClass()); # case 3 var amc = new MyClass(options, new AnotherClass(), ...); # case 4 MyClass mc = new MyClass( something ); # case 5 MyClass mc = new MyClass( new AnotherClass() ); # case 6 MyClass mc = new MyClass( options, new AnotherClass() ); # case 7 var amc = new MyClass(new AnotherClass(), options, ...);
现有问题
当前使用正则:(?s)(?:new\sMyClass\(new\sAnotherClass\(\).*?\))
其中(?s)标记表示点号匹配换行符,适配参数跨多行场景,使用非捕获分组方便后续取反匹配结果。
仅能匹配case2和case7,未处理MyClass括号内AnotherClass前面的内容,直接添加.+?会出现过度匹配问题。
修正方案
修改正则为:
(?s)(?:new\s+MyClass\([^)]*?new\s+AnotherClass\(\)[^)]*?\))
逻辑说明
- 使用
[^)]*?匹配new AnotherClass()前后的参数内容,[^)]代表匹配所有非右括号的字符,严格限制匹配范围不会超出当前MyClass的参数括号,彻底避免跨实例过度匹配 - 非贪婪模式
*?适配多参数、跨换行的书写场景,无论new AnotherClass()出现在参数列表的开头、中间、结尾都能正常命中,可覆盖case2、3、5、6、7所有正向测试用例 - 保留非捕获分组结构,不影响后续通过
|运算符实现取反逻辑
内容的提问来源于stack exchange,提问作者securisec
相关产品推荐
相关产品推荐

