正则表达式的问题

时间:2010-11-02 11:11:08

标签: c# regex

  

日期: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的你好

如果可以通过正则表达式。感谢。

更新:不一定通过正则表达式。

4 个答案:

答案 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,它可能没有正则表达式那么高效。