代码之家  ›  专栏  ›  技术社区  ›  user10392

多行C regex以匹配空行

  •  5
  • user10392  · 技术社区  · 16 年前

    我正在寻找一个多行regex,将匹配出现在一个空白行之后。例如,下面给出了一封电子邮件示例,我想匹配“发件人:Alex”。 ^From:\s*(.*)$ 可以匹配任何“从”行,但我希望它仅限于正文中的行(在第一个空白行之后的任何内容)。

    Received: from a server
    Date: today
    To: Ted
    From: James
    Subject: [fwd: hi]
    
    fyi
    
    ----- Forwarded Message -----
    To: James
    From: Alex
    Subject: hi
    
    Party!
    
    
    4 回复  |  直到 16 年前
        1
  •  2
  •   Loren Segal    16 年前

    我不确定C正则表达式的语法,但您应该有一种方法锚定到字符串的开头(而不是行的开头,如^)。在我的示例中,我将称之为“a”:

    \A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$
    

    但是,请确保打开“多行匹配”选项,使“.”匹配\n

        2
  •  0
  •   Sebastian Redl    16 年前

    为这样的工作编写复杂的正则表达式是一个坏主意,在我看来,最好结合几个简单的查询。例如,首先搜索“\r\n\r\n”以查找正文的开头,然后在正文上运行简单的regex。

        3
  •  0
  •   gregmac    16 年前

    这是在使用一个后视断言。第1组将给出“从”行,第2组将给出实际值(在示例中为“alex”)。

    (?<=\n\n).*(From:\s*(.*?))$
    
        4
  •  0
  •   Teetow    16 年前
    \s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+?
    

    这个 \s{2,} 至少匹配两个空白字符,这意味着你的第一个发件人:詹姆斯不会打。接下来的问题就是寻找下一个“从:”,然后从那里开始捕获。

    用这个 RegexOptions.SingleLine RegexOptions.ExplicitCapture 这意味着外部组不会受到攻击。