1

可能重复:
验证电子邮件地址的最佳正则表达式是什么?

我正在使用这个特殊的正则表达式来检查电子邮件。

"^[A-Za-z0-9](([a-zA-Z0-9,=\.!\-#|\$%\^&\*\+/\?_`\{\}~]+)*)@(?:[0-9a-zA-Z-]+\.)+[a-zA-Z]{2,9}$"

我遇到的问题是,这允许在“@”符号之前使用句点。有什么方法可以修改这个表达式,这样就不会发生这种情况,但所有其他条件都保持不变。

a.@b.com 应该是无效的

在此先感谢-Rollin

4

5 回答 5

7

到目前为止我见过的最好的答案。老实说,如果您指出您正在使用哪种语言或工具集,我会向您指出为您执行此操作的库,而不是告诉您如何为此手动滚动正则表达式。

编辑:鉴于这是在 .NET 上的附加信息,我将使用MailAddress该类并放弃完全使用正则表达式的想法,如下所示:

public bool IsAddressValid(string text)
{
    try
    {
        MailAddress address = new MailAddress(text);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

如果除了验证地址本身之外还有其他要求(例如确保它来自特定的一组域或类似的域),那么您可以在验证地址有效之后通过更简单的测试来做到这一点,正如我在另一个帖子

于 2009-08-12T01:55:24.637 回答
3

一个奇怪的游戏。唯一获胜的举措是不玩。

说真的,使用正则表达式验证电子邮件地址的唯一成功方法是不使用正则表达式验证电子邮件地址。接受电子邮件地址的语法不规则。的确,现代正则表达式可以支持一些非常规语法,但即便如此,为如此复杂的语法维护正则表达式(如您所见)几乎是不可能的。

我能想到的对电子邮件地址的正则表达式的唯一合理使用是在客户端进行一些最小的检查(它是否包含@符号?)。

应该做的是:

  1. 向该电子邮件地址发送一封电子邮件,其中包含供用户单击的链接。如果用户单击链接,则电子邮件地址有效。此外,它存在,并且用户可能是在您的表单中输入电子邮件地址的人。这不仅 100% 验证电子邮件地址,还为您提供更多保证。

  2. 如果您不能做到 1,请使用预先打包的电子邮件验证器。更好的是,同时使用 1 和 2。

  3. 如果您不能执行 1 或 2,请编写一个真正的解析器来验证电子邮件地址。

于 2009-08-12T02:20:14.260 回答
1

你可以把它放在[^\.]前面,@这样它就可以允许除点之外的任何字符

当然这可能不是你想要的,所以你可以在里面放一个[]带有任何合法字符的

以防万一有人的电子邮件名称(我指的是 1 之前的部分@)只有 1 个字符,您可能需要对|

于 2009-08-12T02:08:33.513 回答
0

如果您的正则表达式引擎有后向断言,那么您可以在“@”之前添加一个“(?<!\.)”。

于 2009-08-12T01:59:50.687 回答
0

如果您在 Perl 中执行此操作 - 以下脚本是一个示例

my $string = 'name@domain.com';
if($string =~/(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,9})/)
{
   print "gotcha!";
}
else
{
   print "nope :(";
}

如您所见,Perl 正则表达式字符 \w 优雅地处理句点。如果您将 $string 更改为“name.@domain.com”,它将失败。

于 2009-08-12T02:08:36.993 回答