如何在不使用 lookaheads/behinds 的情况下匹配 AnotherClass 是参数的所有 MyClass 实例?

How can I match all instances of MyClass where AnotherClass is an argument without using lookaheads/behinds?

我要解决的问题是如何匹配以 AnotherClass 为参数的所有 MyClass 实例。我最大的限制是我正在使用 go regex 执行此操作,所以 我无法访问 lookaheads/lookbehinds,而且我还需要在不使用第三方库的情况下进行匹配。但是因为示例可以用多种方式编写,所以我尝试匹配以匹配所有可能的情况。最终目标确实是得到结果的倒数,但目前,重点是先匹配,然后使用|得到倒数。

所以真正的最终目标是匹配任何 MyClass 没有 AnotherClass 作为参数的情况。例如案例 0、1、4 等

regex 101

以下是部分测试用例

# 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) 标志来指示点匹配新行,因为某些情况下可能有新行。我也将它包装在一个非捕获组中,因为最终目标是获得匹配的倒数。

我 运行 遇到的问题是我只能匹配案例 #2 和 #7。我确实理解为什么会这样,因为我没有考虑 MyClass 之后可能出现的任何内容,但是当我执行 .+? 时,它比实际匹配本身更匹配。

如果我的问题没有意义,很乐意回答任何澄清问题。

分号从不出现在语句的中间,因此使用 [^;] 而不是 . 来匹配参数列表中的多个字符。

这适用于您的测试用例(最后的 .* 没问题,因为第一个 [^;] 我们已经不能跨越多个语句)

(?s)(?:new\sMyClass\([^;]*?new\sAnotherClass\(\).*?\))