单线和多线的正则表达式匹配

时间:2015-12-09 20:42:04

标签: regex visual-studio replace

让我们说我正在使用Visual Studio的查找和替换工具,我想查找并注释掉Console.WriteLine(...)的每个实例。但是,我可以了解Console.WriteLine(...)如下所示的多行情况:

Console.WriteLine("Adding drive to VM with ID: {0}. Drive HostVMID is {1}",
     vm.ID, drive.HostVmId);

这些可以继续2,3,4等行,最后以);结束以关闭语句。然后我可以有其他行,紧接着是重要的代码块:

Console.WriteLine("Creating snapshot for VM: {0} {1}", dbVm.ID, dbVm.VmName);
dbContext.Add(new RTVirtualMachineSnapshot(dbVm));

所以我想要做的是提出一个正则表达式语句,它将找到Console.WriteLine的第一类实例以及它的简单单行实例。

我从其他用户那里获得的正则表达式是:

Console\.writeline(?>.+)(?<!;)

哪个匹配任何包含Console.WriteLine以分号结尾的行。但是我需要继续,直到最后确实到达一个右括号后跟一个分号。

我尝试过以下正则表达式:

(Console\.writeline(?>.+)(?<!\);)

但是我认为这是不正确的,因为它仍然只匹配第一行,并且当writeline跨越多行时不会捕获以下行。

在一天结束时,我希望能够捕获完整 Console.writeline语句,无论它使用Visual Studio的查找和替换功能划分多少行,我就是对正则表达式有点困惑,我需要用它来做到这一点。

1 个答案:

答案 0 :(得分:0)

我想你可以试试这个只是寻找一个伪终止,
但不考虑字符串引号。

(?s)\b(Console\s*\.\s*WriteLine\s*\((?:(?!\)\s*;).)*\)\s*;)

格式化:

 (?s)
 \b
 (                             # (1 start)
      Console \s* \. \s* WriteLine \s* \(
      (?:
           (?! \) \s* ; )
           . 
      )*
      \) \s* ;
 )                             # (1 end)

添加:

如果你不能使用dot-all修饰符(?s)和Dot-all选项不可用(应该是),
[\S\s]代替点。

然后只需替换"/** $1 **/"即可将其评论出来。