让我们说我正在使用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的查找和替换功能划分多少行,我就是对正则表达式有点困惑,我需要用它来做到这一点。
答案 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 **/"
即可将其评论出来。