如何在不使用 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 等
以下是部分测试用例
# 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\(\).*?\))
我要解决的问题是如何匹配以 AnotherClass 为参数的所有 MyClass 实例。我最大的限制是我正在使用 go regex 执行此操作,所以 我无法访问 lookaheads/lookbehinds,而且我还需要在不使用第三方库的情况下进行匹配。但是因为示例可以用多种方式编写,所以我尝试匹配以匹配所有可能的情况。最终目标确实是得到结果的倒数,但目前,重点是先匹配,然后使用|
得到倒数。
所以真正的最终目标是匹配任何 MyClass
没有 AnotherClass
作为参数的情况。例如案例 0、1、4 等
以下是部分测试用例
# 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\(\).*?\))