给定以下(经过净化的)输入:
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
}
}
我有以下正则表达式,它捕获使用后发生的循环Type
Type.*<.*>\s*(\w*)[^}]*?(?:while|for)\s*\(.*?\n?.*?(\{(?>[^{}]|(?-1))*\})
https://regex101.com/r/Kr0zQq/3 https://regex101.com/r/Kr0zQq/3
我还有以下正则表达式来捕获类型变量的特定使用Type
:
Type.*<.*>\s*(\w*)[\s\S]*?\K(?<!\+\+)\1(?!->|\+\+)
https://regex101.com/r/Kr0zQq/4 https://regex101.com/r/Kr0zQq/4
我的目标是以某种方式将这些结合起来,最好是ONE正则表达式(如果可能的话,我也希望能够在 VS 内进行此搜索)。考虑到递归正则表达式的性质,我不确定这是否可能......而且我怀疑它不可能。如果没有,那么在搜索数百个文件时不会丢失文件名/数字上下文的聪明的东西会很棒。我基本上需要文件名和行号。上下文很好,但不是必需的。
为了澄清,我想捕获cursorFeature
因为它是类型Type
,然后我想在里面搜索它的用途"loop"{.....}
EDIT
只是关于我使用正则表达式来解决这个问题的说明。被搜索的代码超过一百万行,跨越由各种编译器编译并由多个构建系统构建的多个项目。宏和高级语言功能的使用意味着,例如,即使 VS Intellisenseoften错误解析代码 VS 能够编译。 YCM (vim) 也是如此。因此,一个可能过于贪婪且误报率为 70% 的正则表达式是可以的。 (由于在循环中缺少变量使用的进一步发生,因为通常很容易在该点扫描其余部分。)但是,尝试使用“通用”PCRE 作为单行代码来执行此操作可能是愚蠢的。 :)