C# 使用带有?主题和&;的正则表达式识别电子邮件;体参数
我的电子邮件字符串看起来像这样C# 使用带有?主题和&;的正则表达式识别电子邮件;体参数,c#,regex,C#,Regex,我的电子邮件字符串看起来像这样 reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk?subject='Unsubscribe LIST email@provider.com'&body=Unsubscribe 我目前正在使用以下正则表达式从字符串中获取电子邮件地址。它目前仅在?subject和body参数不存在的情况下才能正常工作 string pat = @"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A
reply.2542A7CD0.EDB.2B.EAE39628@spam-email.co.uk?subject='Unsubscribe LIST email@provider.com'&body=Unsubscribe
我目前正在使用以下正则表达式从字符串中获取电子邮件地址。它目前仅在?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;
var email\u string=Regex.Match(header,@)(?您的正则表达式以$结尾。这意味着您的表达式必须匹配整行。这应该可以:
^(([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}
如果您想要非正则表达式解决方案,请查看以下代码:
可以看到一个工作示例。
这将使用string.split(params char[])
简单地拆分字符串,并确定所需内容。
警告-仅当初始字符串的格式与给定示例完全相同时,此选项才有效。您可以使用以下正则表达式:
(?<email>^[^?]*)\?(?:subject='(?<subject>[^']*)')?(?:&?body=(?<body>.*))?
(?^[^?]*)\?(?:subject='(?[^']*))?(?:&?body=(?*))?
请参见类似的内容?这不起作用。主题和正文参数并不总是存在。有时它只是电子邮件地址。我需要一个通用的解决方案来满足这两种情况。@JakeEvans然后您可以使用?
(?<email>^[^?]*)\?(?:subject='(?<subject>[^']*)')?(?:&?body=(?<body>.*))?