【问题标题】:Search after occurring a special word出现特殊词后搜索
【发布时间】:2015-12-03 19:49:34
【问题描述】:

如何在出现一个单词后进行搜索,例如想象以下字符串:

   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 cmets,如果The Second Colors 被移到The First Colors 上方会怎样。我的意思是如何限制这两个标题之间的结果(例如 The Second ColorsThe Third Colors

【问题讨论】:

  • “第二种颜色”对您来说是一个不变的关键字吗?如果是,您可以先对字符串进行子串化,然后通过 RegEx 查找匹配项
  • @HarutyunImirzyan 不!它不是一个常量关键字
  • @ᔕIᑎᗩKᗩᖇᐯᗩᑎᗪI:这里的常量是什么?你想匹配边界之间的东西。请定义这些界限。否则无法提供有效答案。
  • @stribizhev 实际上常数是

    The Header

    并且在上面的例子中它:

    The Second Colors

    所以我认为常数是

    但是因为我不想改变问题的形式,最好把 The Second Colors 作为一个固定词。

  • @ᔕIᑎᗩKᗩᖇᐯᗩᑎᗪI:现在很清楚您正在使用正则表达式解析 HTML。正确地做到这一点会更容易:1)使用 HTML 解析器来获取正确的 H1,2)获取必要的行。现在,The Second Colors 是起始边界。尾随是什么?

标签: c# regex search


【解决方案1】:

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

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

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

First step demo

然后按照您在第二种方法中所说的那样用红色捕获模式:

(red.*)

Second step demo

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

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

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

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

【讨论】:

  • 为什么使用[\s\S]*??解析纯文本块时,惰性点匹配 (?s).*? 不是一个好主意。想象有一千条不同宽度的线。如果The 出现在`The SecondColors* 块内部 的某处怎么办?
  • @stribizhev 完全同意,单行标志比\s\S 技巧有更好的性能。会用你的 cmets 更新答案
  • 嗯,最佳性能取决于输入的预期长度。我宁愿在这里考虑展开循环技术。
  • @stribizhev 完成。顺便说一句,我需要发布一个问题,这样你就可以解释我了,哈哈
【解决方案2】:
(?<=\bThe Second Colors\b[\s\S]*?)[\n\r].*red\s*([^\n\r]*)

使用变量lookbehind.See demo.

【讨论】:

  • 那不太行。如果将The Second Colors 移到The first Colors 上方,则匹配过多。 Demo
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多