.NET正则表达式否定前瞻 - 我做错了什么?

时间:2016-05-01 16:47:21

标签: c# .net regex negative-lookahead

假设我有:

StartTest
  NoInclude
EndTest

StartTest
  Include
EndTest

正在使用:

/StartTest(?!NoInclude)[\s\S]*?EndTest/g

为什么我要匹配这两个群组?

Regexr示例:http://regexr.com/3db8m

1 个答案:

答案 0 :(得分:2)

如果在NoInclude之后StartTest出现(?s)StartTest(?:(?!(?:Start|End)Test|NoInclude).)*EndTest ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ,则前瞻匹配就会失败。您需要tempered greedy token

StartTest

请参阅regex demo

正则表达式匹配StartTest,然后匹配任何非EndTestNoIncludeEndTest的文字,直至*

由于.贪婪,它会尽可能地使(?:Start|End)Test匹配。负向前瞻将使其在随后的位置停止匹配:

  • StartTest - EndTestNoInclude
  • NoInclude - 只是(?s)

注意RegexOptions.Singleline是一个内联修饰符(相当于.标志),用于修改模式中的RegexOptions.Singleline行为,使其与LF匹配(换行符) ),也。如果没有此修饰符(或没有using System; using System.IO; using System.Text.RegularExpressions; using System.Linq; public class Test { public static void Main() { var input = "StartTest\n NoInclude\nEndTest\n\nStartTest\n Include\nEndTest"; var regex = new Regex(@"(?s)StartTest(?:(?!(?:Start|End)Test|NoInclude).)*EndTest"); var results = regex.Matches(input).Cast<Match>() .Select(p => p.Value) .ToList(); Console.WriteLine(string.Join("\n", results)); } } ),则点匹配除换行符之外的任何字符。

NOTE2 :如果您在本机代码环境之外测试正则表达式,请确保使用适当的测试程序来处理正则表达式。 regexr.com仅支持JavaScript风格,regex101.com支持JS,PCRE和Python风格,RegexStorm.net / RegexHero.net支持.NET风格。还有更多的测试人员,阅读他们支持的内容以及不首先支持的内容。

这是C# demo

{{1}}