1

我不需要捕获字符串的主体。我最终得到了这个正则表达式,但它仍在捕获紧随其后的任何内容Subject。我需要从From,中捕获数据ToCc并且Subject仅不包括正文消息。问题在于这个正则表达式模式Subject:\s*([\s\S]*),我该如何修改它?我仍然是正则表达式的新手。

这是我的正则表达式模式:@"From:\s*(\S*@\S*\.\S*)\s*To:\s*(\S*@\S*\.\S*)\s*Cc:\s*(\S*@\S*\.\S*)\s*Subject:\s*([\s\S]*)"

From:                                             trial@123.com 

To:                                               trial@123.com 

Cc:                                               trial@123.com

Subject:                                    Lorem Ipsum, Lorem Ipsum Lorem Ipsum Lorem Ipsum


 Lorem Ipsum,  


 Lorem Ipsum  


 Lorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem Ipsum
4

1 回答 1

1

要使您的正则表达式按照您希望的方式工作,您需要进行以下操作:

  • 在代码中为对象启用Multiline选项。Regex
  • 将这部分正则表达式更改Subject:\s*([\s\S]*)为下一个Subject:\s*([\s\S]*?)$.

这是工作示例:

string text = @"From:                                             trial@123.com 

To:                                               trial@123.com 

Cc:                                               trial@123.com

Subject:                                    Lorem Ipsum, Lorem Ipsum Lorem Ipsum 
Lorem Ipsum


 Lorem Ipsum,  


 Lorem Ipsum  


 Lorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem Ipsum";

var regex = new Regex(
    @"From:\s*(\S*@\S*\.\S*)\s*To:\s*(\S*@\S*\.\S*)\s*Cc:\s*(\S*@\S*\.\S*)\s*Subject:\s*([\s\S]*?)$",
    RegexOptions.Multiline);

Match m in regex.Match(text));

// The first Group matches whole regex value. We skip it to show only
// matched From, To, Cc and Subject values.
foreach (Group g in m.Groups.Cast<Group>().Skip(1))
{
    Console.WriteLine(g.Value);
}

解释:

  • 通过启用Multiline选项,我们可以使用符号$来匹配行尾。
  • Subject:\s*([\s\S]*?)$
    • $在这个模式的末尾说它必须匹配符号直到行尾。
    • 我们添加?了使正则表达式模式Subject不贪婪。这意味着Subject模式将匹配到第一个符号$(行尾)。如果你删除?你使Subject正则表达式模式贪婪,它会匹配到最后一个符号$

在这里你可以测试这个正则表达式。


@kebbg 在评论中问:

一个问题,假设我不想只在控制台中编写它,我想从每个匹配项中返回值。那可能吗?比如,return (email of from:.), return email of to ...等。

您可以创建一个方法来查找FromTo和值并从该方法中返回它们CcSubject然后你可以在你的项目中使用这个方法:

public static EmailInfo GetEmailInfo(string emailBody)
{
    var regex = new Regex(
        @"From:\s*(\S*@\S*\.\S*)\s*To:\s*(\S*@\S*\.\S*)\s*Cc:\s*(\S*@\S*\.\S*)\s*Subject:\s*([\s\S]*?)$",
        RegexOptions.Multiline);

    Match m = regex.Match(emailBody);

    if (!m.Success)
       return null;

    return new EmailInfo
    {
        From = m.Groups[1].Value,
        To = m.Groups[2].Value,
        Cc = m.Groups[3].Value,
        Subject = m.Groups[4].Value,
    };
}

public class EmailInfo
{
    public string From { get; set; }
    public string To { get; set; }
    public string Cc { get; set; }
    public string Subject { get; set; }
}
于 2020-05-08T05:11:03.710 回答