给定以下(经过处理的)输入:
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
我还有以下正则表达式,用于捕获 Type
类型变量的特定用法:
Type.*<.*>\s*(\w*)[\s\S]*?\K(?<!\+\+)\1(?!->|\+\+)
https://regex101.com/r/Kr0zQq/4
我的目标是以某种方式将这些组合起来,最好是将它们组合成 ONE 正则表达式(如果可能的话,我也希望能够从 VS 中进行此搜索)。鉴于递归正则表达式的性质,我不确定这是否完全可能……而且我怀疑它不是。如果没有,那么在搜索数百个文件时不会丢失文件名/数字上下文的聪明东西会很棒。我基本上需要文件名和行号。上下文很好,但不是必需的。
澄清一下,我想捕获 cursorFeature
,因为它是 Type
类型,然后我想在 “loop”{ 中搜索它的使用。 ....}
编辑
请注意我使用正则表达式来解决这个问题。正在搜索的代码超过一百万行,涵盖由各种编译器编译并由多个构建系统构建的多个项目。宏和高级语言功能的使用意味着,例如,即使 VS Intellisense 经常 错误解析代码 VS 也能够编译。 YCM(vim)也是如此。因此,一个可能过于贪婪的 70% 误报的正则表达式是可以的。 (因为在循环中遗漏了更多的变量使用,因为在该点扫描其余部分通常很容易。)但是,尝试使用“通用”PCRE 作为单行来执行此操作可能是愚蠢的。 :)
最佳答案
您可以通过三个选项来查看匹配的变量名称是否存在于后续循环中。第一个是将 (\1)
添加到原子组并检查您的环境中是否存在此捕获组(如果可能):
(?>(\1)|[^{}]|(?-2))*
其次,您可以通过使用否定先行来缓和 [^{}]
的匹配过程:
(?>(?!\1)[^{}]|(?-1))*
但如果您不像我在评论中提供的演示中所做的那样将右大括号设为可选,它将失败。
第三种更好的解决方法是使用动词 (*ACCEPT)
,它会立即结束成功的匹配,而无需进一步更改正则表达式:
(?>(\1)(*ACCEPT)|[^{}]|(?-2))*
关于c# - 在平衡字符中搜索特定文本(递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49988236/