鉴于以下(消毒)输入:
Return_t
func()
{
Type<SubType> cursorFeature(true);
while (nDist < 800)
{
Result = Example(&var, 0, cursorFeature); //interested in this because inside loop, and not dereferenced or incremented
if (!(++cursorFeature).NoMoreRecords())
{
if (!BLAH(blah)
&& (otherFunc(&var, &cursorFeature->derefenced, MACRO) != 0))
{
bIsChanged = true;
break;
}
memcpy(&var, &cursorFeature->dereferenced, sizeof(anotherType_t));
}
}
//more stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下正则表达式捕获使用后发生的循环 Type
Type.*<.*>\s*(\w*)[^}]*?(?:while|for)\s*\(.*?\n?.*?(\{(?>[^{}]|(?-1))*\})
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/Kr0zQq/3
我还有以下正则表达式,它捕获类型变量的特定用法Type:
Type.*<.*>\s*(\w*)[\s\S]*?\K(?<!\+\+)\1(?!->|\+\+)
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/Kr0zQq/4
我的目标是以某种方式将这些结合起来,最好是组合成一个正则表达式(如果可能的话,我希望能够在VS内部进行搜索).鉴于递归正则表达式的性质,我不确定这是不可能的......我怀疑它不是.如果没有,那么在搜索数百个文件时不会丢失文件名/数字上下文的聪明的东西会很棒.我基本上需要文件名和行号.上下文很棒,但不是必需的.
为了澄清,我想捕获cursorFeature因为它是类型Type,然后我想在里面搜索它的使用"loop"{.....}
编辑
只是关于我使用正则表达式解决这个问题的说明.被搜索的代码超过一百万行,跨越由各种编译器编译并由多个构建系统构建的多个项目.例如,使用宏和高级语言功能意味着甚至VS Intellisense 经常错误地编写VS能够编译的代码.和YCM(vim)一样.因此,一个可能过于贪婪的正则表达式,即70%的误报是好的.(由于缺少循环中变量使用的进一步发生,因为在那一点上通常很容易扫描其余部分.)然而,尝试使用"通用"PCRE作为单行进行这可能是愚蠢的.:)