假设我有:
StartTest
NoInclude
EndTest
StartTest
Include
EndTest
正在使用:
/StartTest(?!NoInclude)[\s\S]*?EndTest/g
为什么我要匹配这两个群组?
Regexr示例:http://regexr.com/3db8m
答案 0 :(得分:2)
如果在NoInclude
之后StartTest
出现(?s)StartTest(?:(?!(?:Start|End)Test|NoInclude).)*EndTest
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
,则前瞻匹配就会失败。您需要tempered greedy token:
StartTest
请参阅regex demo
正则表达式匹配StartTest
,然后匹配任何非EndTest
,NoInclude
或EndTest
的文字,直至*
。
由于.
贪婪,它会尽可能地使(?:Start|End)Test
匹配。负向前瞻将使其在随后的位置停止匹配:
StartTest
- EndTest
或NoInclude
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}}