要使您的正则表达式按照您希望的方式工作,您需要进行以下操作:
- 在代码中为对象启用
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 ...等。
您可以创建一个方法来查找From、To和值并从该方法中返回它们Cc。Subject然后你可以在你的项目中使用这个方法:
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; }
}