C# .NET Regex查找分号时的负前瞻性

C# .NET Regex查找分号时的负前瞻性,c#,regex,C#,Regex,假设我有以下正则表达式: Console.writeline.+(?!;) (Console\.writeline(?>.+)(?<!\);) 我想查找任何包含“console.writeline”的行,该行后跟任意字符一次或多次,但不以分号结尾 当我使用以下字符串测试此正则表达式时: Console.WriteLine("Final total count of missing VMs: {0}", missingVms.Count); 这很相配。但是,字符串以分号结尾,所以

假设我有以下正则表达式:

Console.writeline.+(?!;)
(Console\.writeline(?>.+)(?<!\);)
我想查找任何包含“console.writeline”的行,该行后跟任意字符一次或多次,但不以分号结尾

当我使用以下字符串测试此正则表达式时:

Console.WriteLine("Final total count of missing VMs: {0}", missingVms.Count);
这很相配。但是,字符串以分号结尾,所以它不应该不匹配吗

我意识到我可以使用
[^;]
,但我更好奇的是,为什么在.NET中寻找分号似乎不适用于负面的lookahead

编辑:澄清:

假设我正在使用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));
所以我想做的是找到一个regex语句,它将找到
Console.WriteLine的第一类实例以及它的简单单行实例

我从这个问题的一个答案中得到的正则表达式是

Console\.writeline(?>.+)(?<!;)
然而,我认为这是不正确的,因为当writeline跨越多行时,它仍然只匹配第一行,而不捕获下面的行


在一天结束时,我希望能够使用Visual Studio的查找和替换功能捕获完整的Console.writeline语句,而不管它跨越多少行,我对我需要使用的正则表达式有点困惑。

您可以使用以下带有查找功能的正则表达式:

或者(相同,但与“展开循环”技术兼容,带有可选空格以使其更安全):

并替换为

/* $0 */


在VS Find and Replace中,应该使用
[\s\s\r]
匹配任何符号,包括换行符。

我明白了。太简单了!谢谢@Stribizhevcd我可以使用同样的查找来检查(并匹配)Console.writeline进入下一行的实例吗?当前正则表达式匹配的行中包含的Console.writeline不是以分号结尾的,但是如果我想继续查找下一行,直到找到分号,该怎么办?请检查,但我不确定您需要什么。我用我正在尝试的方法编辑了我的原始注释。可选:
Console\.writeline+(?默认情况下,
匹配除某些链接中断字符以外的所有字符。您可以通过指定单行标志来更改
的含义,这将强制
匹配所有字符,包括换行符。@JDB我如何将其与VS的“查找和替换”一起使用来执行我试图执行的操作(正如我在编辑中所解释的)?我正在尝试查找“Console.writeline(…);”的每个实例,即使它跨越多行。然后我想将整个匹配项替换为相同的文本,只注释掉(前面两个斜杠)。您应该在一开始就提到任务的类型。您需要一个更具体的正则表达式。在VS中的“查找和替换”工具中,不能使用点跨行。您可以尝试在正则表达式的开头使用
(?s)
。在.NET中,这设置了单行标志。但不知道它是否在VS中工作。请参阅@JDB:No,
(?s)
在那里不起作用。我现在正在VS中检查正则表达式。
Console\.writeline\s*\([\s\S\r]+?\);(?=$|\r?\n)
Console\.writeline\s*\([^)]*(?:\)(?!\s*;\s*(?:$|\r?\n))[^)]*)*\)\s*;\s*(?=$|\r?\n)
/* $0 */