我的电子邮件字符串看起来像这样;
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;
答案 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