使用正则表达式识别电子邮件?主题和&身体参数

时间:2017-03-21 16:02:48

标签: c# regex

我的电子邮件字符串看起来像这样;

reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk?subject='Unsubscribe LIST email@provider.com'&body=Unsubscribe

我目前正在使用以下Regex从字符串中获取电子邮件地址。它目前仅适用于?subject&body参数不存在的地方。

string pat = @"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9_]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$";

我正在尝试从上面提取电子邮件,主题和正文。因此,使用提供的示例,输出应为;

email = reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk
subject = Unsubscribe LIST email@provider.com
body = Unsubscribe

但是,由于存在?subject&body,因此上述正则表达式未命中。例如,当仅存在电子邮件时,上述正则表达式起作用; reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk

我需要一个适用于两种情况的解决方案;

  • 仅存在电子邮件地址时
  • 当电子邮件地址+?主题参数存在时
  • 当电子邮件地址+?主题+&身体参数存在时

整个代码;

var email_string = Regex.Match(header, @"(?<=\<mailto:).[^>]*").Value;

string pat = @"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9_]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$";

var email = Regex.Match(email_string, pat).Value;
var subject = Regex.Match(email_string, "(?<=subject=).[^&]*").Value;
var body = Regex.Match(email_string, "(?<=body=).[^&]*").Value;

3 个答案:

答案 0 :(得分:1)

如果您不喜欢非正则表达式解决方案,请查看以下代码:

string information = "reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk?subject='Unsubscribe LIST email@provider.com'&body=Unsubscribe";

string[] split = information.Split('?', '&', '=');

string email = split[0];
string subject = split[2];
string body = split[4];

可以看到here的一个工作示例。

这将简单地使用string.Split(params char[])拆分字符串并确定您想要的内容。

警告 - 仅当您的初始字符串格式与给定示例完全相同时,此方法才有效。

答案 1 :(得分:0)

你的正则表达式以$结尾。这意味着你的表达式必须匹配整行。这应该有效:

^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9_]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}

答案 2 :(得分:0)

您可以使用以下正则表达式:

(?<email>^[^?]*)\?(?:subject='(?<subject>[^']*)')?(?:&?body=(?<body>.*))?

请参阅online demo