在发生特殊字后搜索

时间:2015-12-03 19:49:34

标签: c# regex search

如何在发生单词后搜索,例如想象下面的字符串:

   The Fisrt Colors 
       red green yellow
       blue white violet
       red green orange
   The Second Colors
       red black white 
       green cyan magenta
       red magenta blue

我需要搜索包含red的行,并且在上面示例中它们位于The Second Colors之后,期望的结果是:

red black white 
red magenta blue

我用以下方法进行简单搜索:

        foreach (Match match in Regex.Matches(MyString, @"[\n\r].*red\s*([^\n\r]*)"))
        {

        }

但上面的代码在这种情况下不起作用,因为它返回

    red green yellow
    red green orange
    red black white 
    red magenta blue

编辑1: 正如@Jonesopolis评论的那样,如果将The Second Colors移到The First Colors之上,该怎么办?我的意思是如何限制这两个标题之间的结果(例如The Second ColorsThe Third Colors

2 个答案:

答案 0 :(得分:1)

当您必须匹配模式时,正则表达式是一个强大的工具,但是当您开始向模式添加逻辑时,很容易陷入丑陋的情况。

因此,您可以使用两个正则表达式来简化您的工作。例如,您可以使用第一个正则表达式来提取Second Colors的内容,如下所示:

Second Colors([\s\S]*?)(?:The|$)

First step demo

然后用第二种方法说明用红色捕捉图案:

(red.*)

Second step demo

这种方法比使用一个怪物正则表达式来制作技巧更清晰

更新:在评论中提及 stribizhev ,您实际上可以用通配符[\s\S]替换.的技巧并利用单行标志。所以你可以:

(?s)Second Colors(.*?)(?:The|$)

你将拥有一个性能更好的正则表达式。

答案 1 :(得分:-1)

(?<=\bThe Second Colors\b[\s\S]*?)[\n\r].*red\s*([^\n\r]*)

使用变量lookbehind。{{3}}