如果匹配项不包含指定的关键字,请放弃匹配

时间:2018-03-12 15:14:33

标签: c# regex

示例文字:

START
This is example example example example example example example example .
END
START
This is example 1234 14 756 214 6456 5 2 4234 66 match.
END
START
This is This isThis isThis isThis isThis isThis isThis isThis is.
END

我只需匹配“START”和“END”关键字之间的文字,并且其中包含“匹配”字样。

我目前有这个正则表达式:

Regex.Matches(myString, @"START(.*?match.*?)END", RegexOptions.Singleline);

它无法正常工作,因为它会在匹配“END”关键字之前等待“匹配”字出现:

This is example example example example example example example example .
END
START
This is example 1234 14 756 214 6456 5 2 4234 66 match.

如果“START”和“END”关键字不包含“匹配”字,我怎么能丢弃句子?

3 个答案:

答案 0 :(得分:0)

您需要阻止正则表达式引擎跨越匹配边界;懒惰量词不会这样做,但否定先行断言可以:




  Regex.Matches(myString,@“START((?:(?!\ bEND \ b)。)*匹配(?:(?!\ bEND \ b )。)*)END“,RegexOptions.Singleline);
  




测试它在regex101.com上生活





(?:(?!\ bEND) \ b)。)* 匹配任何字符(),但前提是它没有启动 END 关键字(?!\ bEND \ b )。通过将其包含在重复的非捕获组(?:...)* 中,我们可以确保在每个字符上测试此条件。




答案 1 :(得分:0)

我到达这个解决方案,似乎比其他人简单。它允许除单词END之外的任何字符(在这种情况下也包括换行符,但这就是单行的用途)

START((?!END).)*match((?!END).)*END

答案 2 :(得分:0)

您确定要使用正则表达式执行此类任务吗?你可以通过以下方式解决它:

        string mystring = "START This is example example example example example example example example. END START This is example 1234 14 756 214 6456 5 2 4234 66 match. END START This is This isThis isThis isThis isThis isThis isThis isThis is. END";
        string result = "";

        foreach(string text in mystring.Split(new string[] { "START", "END" }, StringSplitOptions.RemoveEmptyEntries))
        {
            if (text.Trim().Contains("match"))
            {
                result = text;
            }
        }