正则表达式来查找没有using块的CreateGraphics调用

本文关键字:块的 CreateGraphics 调用 using 查找 正则表达式 | 更新日期: 2023-09-27 18:21:57

我的任务是在我们的代码库中查找所有对CreateGraphics的调用,这些调用没有被using块包围,并在它们周围添加using块。

我知道我可以用正则表达式找到这些,但我需要一些语法方面的帮助。

我需要一个regex,它可以与Visual Studio 2010的"在文件中查找"对话框一起使用,该对话框将使用查找包含CreateGraphics但不是以开头的任何行。

匹配此项:

  pnlSearchAndBrowseButton.CreateGraphics().DrawLine(lineLight, 2, h - 1, w - 1, h - 1);

但不是这个:

  using (Graphics g = label.CreateGraphics())

任何一行的开头可能有空格,也可能没有空格。

正则表达式来查找没有using块的CreateGraphics调用

注意: 不再相关,因为问题描述发生了重大变化。在我看来,这仍然是解决实际问题的可行方案


(?<!using.+)'.CreateGraphics'(

可能会起作用。PowerShell测试:

PS> $re='(?<!using.+)'.CreateGraphics'('
PS> 'pnlSearchAndBrowseButton.CreateGraphics().DrawLine(lineLight, 2, h - 1, w - 1, h - 1);',
>> 'using (Graphics g = label.CreateGraphics())' -match $re
>>
pnlSearchAndBrowseButton.CreateGraphics().DrawLine(lineLight, 2, h - 1, w - 1, h - 1);

需要注意的是,正则表达式在不支持可变长度查找的语言中不起作用。但是.NET确实如此,正如上面所看到的。

或者甚至不使用正则表达式(亵渎!):

if (line.Contains(".CreateGraphics(") && !line.Contains("using")) ...

或者做两遍变体:

lines.Select(l => l.Contains(".CreateGraphics(")).Select(l => !l.Contains("using"))

这似乎有效。

在文件中查找->查找选项->使用->正则表达式

然后将此正则表达式放入"查找内容:->^~(:Wh*using).*CreateGraphics "

正则表达式的完整列表->

http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx

或者您可以使用命令行工具FINDSTR:

findstr/N/S/C:CreateGraphics*.cs|findstr/V/C:使用

这将为您提供一个包含"CreateGraphics"但不包含"using"的所有行的列表。