我想要一个函数来测试字符串是否像电子邮件地址一样格式化。
.NET框架内置的功能是什么?
这有效:
Function IsValidEmailFormat(ByVal s As String) As Boolean
Try
Dim a As New System.Net.Mail.MailAddress(s)
Catch
Return False
End Try
Return True
End Function
但是,有没有更优雅的方式?
不要为自己的验证而烦恼。.NET 4.0通过MailAddress
该类大大改善了验证。只需使用MailAddress address = new MailAddress(input)
如果抛出,则无效。如果您的输入有任何可能的解释为符合RFC 2822的电子邮件地址规范,它将对此进行解析。上面的正则表达式,甚至是MSDN文章中的正则表达式都是错误的,因为它们没有考虑显示名称,带引号的本地部分,域的域文字值,本地部分的正确点原子规范,邮件地址可以放在尖括号中,用于显示名称的多个带引号的字符串值,转义字符,显示名称中的unicode,注释以及最大有效邮件地址长度。我花了三周的时间为System.Net.Mail在.NET 4.0中重新编写了邮件地址解析器,并相信我,这比仅提供一些正则表达式要困难得多,因为存在很多边缘情况。的MailAddress
.NET 4.0 beta 2中的类将具有此改进的功能。
还有一件事,您唯一可以验证的是邮件地址的格式。如果不向该地址发送电子邮件并查看服务器是否接受该电子邮件地址,则无法验证该电子邮件地址实际上对于接收电子邮件有效。这是不可能的,尽管您可以向邮件服务器提供SMTP命令以尝试对其进行验证,但很多时候这些命令将被禁用或返回错误的结果,因为这是垃圾邮件发送者查找电子邮件地址的常用方法。
感谢您的回应。我很高兴听到微软对此给予了一定的关注!但是,为了澄清一下,您是说,最佳实践是捕获一个异常,就像我在上面的函数中所做的那样?
我想补充一点,捕获异常作为验证数据的方式通常是不好的做法。主要原因是,特别是在对大量数据进行验证时的性能,但通常认为这是不好的做法。对于像电子邮件地址这样简单的事情,我会选择使用RegEx代替。
但是,这似乎只允许使用“ part1 @ part2”,而不需要“ .com”或其他顶级域名。
自从我写这篇文章已有很长时间了,但是它不应该让part2只是一个随机词,它可以是点原子或域文字,而域文字可以只是“ part2”,但必须用“ [ “和”]“才能生效。点原子必须带有“。”。并在其前后加上一个合法的点原子字符。规范位于此处:tools.ietf.org/html/rfc2822#page-17另外,它可能会将没有括号的域文字解释为域文字,并为您添加括号。不确定,但听起来像我会做的。
我也可以输入myname@mail*.com并接受它,所以这不起作用:(