【问题标题】:Validating e-mail with regular expression VB.Net使用正则表达式 VB.Net 验证电子邮件
【发布时间】:2008-12-15 20:07:55
【问题描述】:

我正在 VB.Net 中处理一个小项目,我从文本框中获取输入,并且需要验证这是一个电子邮件地址。

我发现这个表达式 "^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0- 9-]+)(.[a-z]{2,4})$",但我找不到任何方法来测试它是否通过。

我想要一些类似的代码:

if not txtEmail.text = regexString then
    something happens..
else
    something else happens..
end if

【问题讨论】:

  • 这是一个在 StackOverflow 上记录的好问题 - 我觉得在这里问这个问题没有错。

标签: vb.net regex email


【解决方案1】:

使用System.Text.RegularExpressions.Regex 类:

Function IsEmail(Byval email as string) as boolean
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$")

    return emailExpression.IsMatch(email)
End Function

关于这个答案,最重要的一点是我自己没有编写正则表达式。有很多错误的方法似乎是正确的,并且您可以将其带到多个细节级别。例如,您是否希望将其限制为有效的顶级域,如果是,您如何解释他们现在偶尔添加新 TLD 的事实?如果正则表达式是那个测试最合适的地方,还是应该有单独的代码来做那个检查?自从最初撰写以来,即使此答案中的表达现在也非常陈旧。

我建议为您知道会随着时间推移而维护的表达式找到一个外部资源。

【讨论】:

  • If … Then Return True Else Return False 无疑是反模式的前十名。 :-/
  • 是的:这是我在上次演出中养成的一个坏习惯,政策阻止直接返回布尔表达式的结果。修复示例。
  • 表达式已损坏。见stackoverflow.com/questions/369543/…
  • 匹配电子邮件地址的正则表达式本身就被破坏了。你可以产生一种你几乎涵盖了所有基础的感觉,但最终几乎总会有一个你拒绝的有效模式,或者你允许的无效模式。你的不包括撇号是有效的,但它们是。
  • If ... Then Return True Else Return False 的可读性是 Return Matchobject 的 10 倍。这就是你在上面所做的事情。你不知道返回类型是什么,只是看看它,你可能距离 as 布尔值有 400 行代码。可读性胜过您的简约代码浪费的“完美模式”……任何一天。更好的可读性减少了错误。根据我 25 年的经验,大多数对自己的完美模式自大的程序员往往有最多的错误。
【解决方案2】:

my article on matching email addresses with a regex 中选择您最喜欢的正则表达式,并将其插入到此 Visual Basic 代码中:

If Regex.IsMatch(SubjectString, "regex") Then
    Error = False
Else
    Error = True
End If

匹配电子邮件地址的最佳正则表达式是一个有争议的话题,我不想在这里讨论。我的文章讨论了选择正则表达式时应该注意的问题。 Joel Coehoorn 的答案中的正则表达式绝对不是一个好表达式。

【讨论】:

  • 很好地描述了链接网页上的各种权衡。
【解决方案3】:

这种事情有一个很棒的网站http://regexlib.com/。它不仅有一个测试器应用程序,您可以在其中粘贴正则表达式并对其进行测试,而且还有一个正则表达式库,您可以将其用于社区对其有效性的反馈等。我不是正则表达式专家,所以当我需要一个快速的正则表达式时,我会去这里。

此外,如果您正在考虑自己开发正则表达式,有一个名为Regex Buddy 的出色工具可以让您使用易于理解的正则表达式英文解释即时创建和测试您的正则表达式。

【讨论】:

  • 我遇到过这样一个案例,其中一封电子邮件未能通过上面的简单正则表达式 "^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0- 9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$"。回到这里,我使用了 Anderson 乐于分享的 regexlib,并搜索了评分最高的“电子邮件”正则表达式。有 4 次点击,这个是列表的顶部,对我来说效果最好:“​​^((([!#$%&'+\-/=?^_{|}~\w])|([!#$%&'*+\-/=?^_{|}~\ w][!#$%&'*+\-/=?^_{|}~\.\w]{0,}[!#$%&'*+\-/=?^_{|}~\w]))[@]\w+([-.]\w+)*\.\w+([ -.]\w+))$" 源和测试页面在这里:regexlib.com/RETester.aspx?regexp_id=2558
【解决方案4】:

可能是题外话,因为它不是正则表达式解决方案,但您可以只使用 .NET 2.0 的一些内置功能:

try
{
   MailAddress email = new MailAddress(txtEmail.Text);
}
catch(FormatException fe)
{
   // output error
}

【讨论】:

  • 这在我目前正在处理的项目中无处不在,我正在把它撕掉。我看不出抛出异常是多么好的逻辑或验证技术,除了它是一项昂贵的任务。请随时纠正我
  • 我很难破解它,我向它传递了各种垃圾邮件,它毫无例外地吞噬了它们,我从我的代码中删除了它。
  • 如果您使用电子邮件地址,例如john. doe@anywhere.com,在john. 后面有一个空格,则MailAddress 对象将接受该文本,而MailAddress.Address 的值为@ 987654325@,不抛出异常。
【解决方案5】:

那个正则表达式并不完整......事实上......大多数都不是(查看this articlethis one)。

除非您真的很享受痛苦,否则正则表达式不是验证电子邮件地址的正确方法。

【讨论】:

  • 您能告诉大家在 .net 中验证电子邮件地址的正确方法是什么吗?
【解决方案6】:

电子邮件地址:RFC 2822(简体) 匹配一个普通的电子邮件地址。不检查顶级域。 需要打开“不区分大小写”选项。

Dim FoundMatch As Boolean
Try
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase)
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

If Not FoundMatch Then
   Error = True
Else
   Error = False
End If

【讨论】:

  • 表达式已损坏(例如,不允许 tld-only-addresses)。见stackoverflow.com/questions/369543/…
  • 示例没有损坏。它不检查顶级域。正如我在评论中提到的。请参阅我的另一条评论。
  • 我永远无法理解为什么有人会像你在这个 sn-p 中的最后一个那样写一个 IF 语句。这简直是​​疯了。应该是:Error = Not FoundMatch
  • 是的,这样会更简短。我是为了总体清晰。所以现在你知道为什么有人会像这个 sn-p 中的最后一个那样写一个 IF 语句 :-)
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多