c# - 在平衡字符中搜索特定文本(递归

标签 c# regex visual-studio perl

给定以下(经过处理的)输入:

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))*

Live demo

关于c# - 在平衡字符中搜索特定文本(递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49988236/

相关文章:

c++ - Microsoft Visual Studio (2008) - 解决方案资源管理器中的过滤器

c# - 将 nuget 包转移到新的解决方案

python -\Z 与字符串结尾不匹配

c# - 在 Visual Studio 中使用代码片段

regex - 用于匹配多种类型编号列表的正则表达式

regex - sed 及其可选符号的正则表达式

visual-studio - 使用TFS并传递另一个开发人员错误

c# - 如何使用 LINQ 从通用列表中获取下一个合适的值?

c# - 在 C# 中使用 DateTime 和 TimeSpan 的秒表

javascript - 是否可以将向导控件侧边栏自定义为如下所示?