在平衡字符内搜索特定文本(递归

2024-01-07

给定以下(经过净化的)输入:

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 作为单行代码来执行此操作可能是愚蠢的。 :)


您可以通过三个选项来查看以下循环中是否存在匹配的变量名称。第一个是添加(\1)到原子组并检查您的环境中是否存在此捕获组(如果可能):

(?>(\1)|[^{}]|(?-2))*

其次,你可以调整匹配过程[^{}]通过使用负前瞻:

(?>(?!\1)[^{}]|(?-1))*

但如果您不像我在评论中提供的演示中那样将右大括号设为可选,则会失败。

第三个也是更好的解决方法是使用动词(*ACCEPT)这会立即导致成功匹配结束,而无需对正则表达式进行进一步更改:

(?>(\1)(*ACCEPT)|[^{}]|(?-2))*

现场演示 https://regex101.com/r/fxWtAF/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在平衡字符内搜索特定文本(递归 的相关文章

随机推荐