电子邮件验证C#asp.net

时间:2019-05-31 21:45:15

标签: c# regex

我使用以下模式来验证我的电子邮件字段。

    return Regex.IsMatch(email,
                 @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                 @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));

它使用以下参考: https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format

我的要求是用户部分的最大数量为64个字符,整个电子邮件字符串的最大长度为254个字符。参考中的图案最多只能包含134个字符。有人可以清楚说明该模式的含义吗?什么是实现我目标的正确模式?

3 个答案:

答案 0 :(得分:2)

您引用的代码是过度设计的,验证电子邮件所需要做的只是检查at符号和点。如果您需要更精确的信息,则可能是您实际上需要向收件人发送电子邮件,并要求他们确认他们保留了该电子邮件,这比复杂的正则表达式更简单,并且提供了更高的准确性。

这样的正则表达式就是:

.+@.+\..+

在下方评论

.+      At least one of any character
@       The at symbol
.+      At least one character
\.      The . symbol
.+      At least one character 

当然,这意味着某些电子邮件可能会被接受为误报,例如当用户打算使用tomas@company.com时,例如tomas@company.c,但是即使您设计了最可靠的正则表达式,也要检查列表中的正则表达式。数量的已接受TLD中,您永远不会捕获tomas@company.co,并且当发布新的TLD且代码未更新时,您可能会插入肯定错误,例如tomas@company.blockchain。

所以简单点吧。

答案 1 :(得分:1)

如果您想避免使用正则表达式(我认为很难解密),则可以在电子邮件字符串上使用.Split()方法,并使用“ @”符号作为分隔符。然后,您可以从此处检查两个组件的字符串长度。

答案 2 :(得分:0)

几年前,我在C#中编写了一个电子邮件验证属性,该属性应识别语法有效电子邮件地址的大部分子集,这些子集的形式为 local-part @ domain -我之所以说“最”是因为我没有费力去尝试处理punycode,IPv4地址文字(点划线的四边形)或IPv6地址文字之类的东西。

我敢肯定,我也错过了很多其他情况。但这对于我们当时的目的来说已经足够好了。

使用它可以保持身体健康:C# Email Address validation

在继续撰写自己的文章之前,您可能需要阅读多个相关的RFC,并尝试了解构成“有效”电子邮件地址(不是您所想的)的各种说法,以及(2 )停止尝试验证RFC 822电子邮件地址。关于“验证”电子邮件地址的唯一方法是向其发送邮件,然后查看其是否退回。这并不意味着任何人都住在该地址,或者那个邮箱下周不会消失。

Jeffrey Friedl的书掌握正则表达式具有[或多或少?]个完整的正则表达式,以匹配语法上有效的电子邮件地址。它的长度为 6,598 个字符。

您知道postmaster@.是合法的电子邮件地址吗?从理论上讲,它可以使您成为根DNS服务器的邮局主管。

或者[理论上] MyDepartmentServer!MainServer!BigRouter!TheirDepartmentServer!SpecificServer!jsmith之类的“爆炸路径”电子邮件地址有效。在这里,您可以定义电子邮件应通过网络的实际路径。如果您知道所涉及的网络拓扑,将有帮助。