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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:02