日期:2010年10月31日星期日21:12:24 +0600
来自:jim@google.com
X-Priority:3(正常)
消息ID:< 1176875350.20101031211224@goole.com>
收件人:jim2@google.com
主题:我的主题
MIME版本:1.0
内容类型:text / plain;字符集=窗户-1251
Content-Transfer-Encoding:quoted-printable
吉姆,你好。
帮助获取信息。我需要在数组中有如下内容:
Sun,2010年10月31日21:12:24
jim@google.com
jim2@google.com
MySubject
来自Jim的你好
如果可以通过正则表达式。感谢。
更新:不一定通过正则表达式。
答案 0 :(得分:3)
您可以使用以下代码制作密钥与值的字典。它假设密钥是唯一的。
var lookupDictionary=
Regex
.Matches(src, "(.+?): (.+)", RegexOptions.Multiline)
.Cast<Match>()
.ToDictionary(m => m.Groups[1].Value,m => m.Groups[2].Value);
因此,要获得To
字段,您可以:
lookupDictionary["To"]
要抓住身体,你需要一个单独的表达式:
var match=Regex.Match(src, "(?<=.*\n\n).*");
var body=match.Success ? match.Value : null;
您可能正在处理CRLF行结尾,在这种情况下,正则表达式将是:
var match=Regex.Match(src, "(?<=.*\r\n\r\n).*");
var body=match.Success ? match.Value : null;
答案 1 :(得分:1)
我认为最好不要使用正则表达式。而是逐行阅读文本。
标题行由一个键,一个冒号(:)和一个值组成,并以空行结束。其余的是(邮件)正文。
您可以很容易地过滤掉您想要的标题和文本的其余部分。
如果您遇到任何步骤问题,请随时再询问。但包括你到目前为止所尝试的内容。
编辑:至于为什么不是正则表达式:格式非常简单,因此您可以轻松获得所需的值,而无需通过正则表达式过滤它的开销。如果你想让一个正则表达式只获得你想要的值,那么很快就会变得非常困难。此外,特别是对于新手来说,逐行阅读更容易理解。答案 2 :(得分:1)
希望此代码能够提供预期的结果
MatchCollection mColl = Regex.Matches(txtContent.Text.Trim() ,"(?<=:).+");
for (int i = 0; i < mColl.Count; i++)
{
listBox1.Items.Add(mColl[i].Value.ToString().Trim());
}
答案 3 :(得分:1)
如果没有正则表达式,我就是这样做的。
var lines = msg.Split(new []{Environment.NewLine}, StringSplitOptions.None);
var headerLines = lines.TakeWhile(s => s != string.Empty);
var bodyLines = lines.SkipWhile(s => s != string.Empty).Skip(1);
string body = bodyLines.Aggregate((s1, s2) => s1 + Environment.NewLine + s2);
var headers = (from hl in headerLines
select new { Key = hl.Split(new []{':'}, 2)[0].Trim()
, Value = hl.Split(new[] {':'}, 2)[1].Trim()}).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
第一行中的msg
是您的邮件和标题组合在一起,如问题所示。
Skip(1)
的额外bodyLines
可确保您不会使用表示正文正在启动的空白行。
Aggregate
方法再次将bodyLines
与换行符连接在一起。
最终的linq查询将每个标题行拆分为一个键和一个值,然后将其转换为Dictionary<string, string>
。
要查看您拥有的内容,请按以下方式访问:
Console.WriteLine(headers["Date"]);
Console.WriteLine(headers["From"]);
Console.WriteLine(headers["To"]);
Console.WriteLine(headers["Subject"]);
Console.WriteLine(body);
我更喜欢使用正则表达式,因为我只需知道C#就可以读取它,我也不需要知道正则表达式。但是,由于所有的linq,它可能没有正则表达式那么高效。