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