电子邮件地址输入验证

4

有没有办法在wpf C#中为电子邮件地址制作文本框输入验证?使用正则表达式或验证表达式或任何可以帮助的东西,最好附带代码示例和一些说明。


1
看右边的相关栏目。有数千个答案,只需搜索即可。 - Steve
我问的原因是因为其他类似问题的答案都很旧了。我想也许有更简单和更实时的方法! - Tinaira
4个回答

16

在text_changed事件中,您可以将文本框的值传递到辅助类中。

public static class ValidatorExtensions
{
    public static bool IsValidEmailAddress(this string s)
    {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(s);
    }
}

现在在文本更改事件中,您可以测试输入

private void myTextBox_TextChanged(object sender, EventArgs e)
{
   bool result = ValidatorExtensions.IsValidEmailAddress( myTextBox.Text );
}

请问您能告诉我在text_changes事件中应该写什么吗?因为我现在有点困惑。 - Tinaira
我让这个例子更加清晰,希望这能帮到你! - Justin
我用if语句做了它,也用lostfocus事件实现了,总之,非常感谢...能否描述一下正则表达式,以便我能够理解它? - Tinaira
1
请不要使用像这样的简短/不正确的正则表达式,否则像我这样的人会发现网站将我们的电子邮件地址声明为无效,而实际上它们并不是。相反,请考虑此答案 https://dev59.com/23M_5IYBdhLWcg3wdy_z - Jono

7

检查电子邮件地址是否有效有几种方法。

关于System.Net.Mail.MailAddress类
关于正则表达式

 static void Main(string[] args)
        {
            var validMail = "validMail@gmail.com";
            var invalidMail = "123";
            Console.WriteLine("IsValidMailAddress1 Test");
            Console.WriteLine(string.Format("Mail Address : {0} . is valid : {1}", validMail, IsValidMailAddress1(validMail)));
            Console.WriteLine(string.Format("Mail Address : {0} . is valid : {1}", invalidMail, IsValidMailAddress1(invalidMail)));

            Console.WriteLine("IsValidMailAddress2 Test");
            Console.WriteLine(string.Format("Mail Address : {0} . is valid : {1}", validMail, IsValidMailAddress2(validMail)));
            Console.WriteLine(string.Format("Mail Address : {0} . is valid : {1}", invalidMail, IsValidMailAddress2(invalidMail)));

        }


        static bool IsValidMailAddress1(string mail)
        {
            try
            {
                System.Net.Mail.MailAddress mailAddress = new System.Net.Mail.MailAddress(mail);

                return true;
            }
            catch
            {
                return false;
            }
        }

        static bool IsValidMailAddress2(string mailAddress)
        {
            return Regex.IsMatch(mailAddress, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        }

我正在制作一个WPF应用程序...你能告诉我如何为WPF做吗? - Tinaira
实际上它们非常相似。你可以在你的帮助类中创建一个方法,然后你可以在任何地方调用它。 - Fatih Sert

1

实际上,在验证电子邮件地址时需要考虑许多事情:

  • 几乎所有在互联网上找到的正则表达式都不是100%正确的

  • 即使正则表达式完美无缺,像Outlook或Exchange这样的电子邮件客户端或服务器可能不接受奇异但有效的电子邮件地址。

以下是一个奇怪但有效的电子邮件地址的例子:

"very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"@strange.example.com

这是类型:

John.Doe@example.com

但实际上,RFC 5322:互联网消息格式:地址规范指定电子邮件地址应该像这样:
John Doe<John.Doe@example.com>

第一个“John Doe”是显示名称。
如果添加显示名称验证,它会变得相当复杂。但即使没有显示名称,大多数正则表达式也无法将以下电子邮件地址识别为有效的: “John@Doe”@example.com
因此,建议只是警告用户如果电子邮件地址看起来很奇怪,但让用户决定他是否打错了或者他实际上想输入该电子邮件地址。
除了验证之外,当用户只能输入合法字符时可能会有帮助。
阅读我的文章 CodeProject: Email Address Validation Explained,其中包含一个完全实现和测试过的WPF电子邮件文本框的代码。

1

这是我找到的最好的一个:

Regex.IsMatch(emailAddress, @"\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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接