验证基于UTF8字符的电子邮件

时间:2014-01-17 09:00:17

标签: c# email-validation

我正在尝试使用以下正则表达式验证电子邮件(UTF8)

Regex.IsMatch(emailAddress, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant);

对于“äpfel@domain.com”,它返回false。

有关如何改进它的任何建议。

2 个答案:

答案 0 :(得分:0)

简单的答案是你不想这样做:正则表达式是一种验证电子邮件地址的可怕方式。

您的具体问题的答案是,如果您愿意阻止有效地址并允许无效地址,您希望使用[\p{L}\p{M}\p{N}]而不是\w来匹配用户名部分中的Unicode字符字符地址。

答案 1 :(得分:0)

  1. UTF-8与此无关,您正在验证字符串,而不是其特定的编码。

  2. 您的正则表达式实际上为"äpfel@domain.com"返回true(带或不带CultureInvariant选项)。您可以自行尝试Console.Write(Regex.IsMatch("äpfel@domain.com", @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant));,然后获得true

  3. 您将在info@ουτοπία.δπθ.gr等所有IDN上失败,如果您关心非ASCiI限制的电子邮件地址,您可能希望将其包括在内。 (如果你想排除被禁止的混淆,你会变得非常复杂)。

  4. 其他人使用正则表达式验证电子邮件时遇到了问题,但归结为:

    1. 实际的电子邮件语法比人们想象的要复杂得多(甚至在我们处理非ASCII扩展之前)。例如你知道Abc\@def@example.com是有效的电子邮件地址吗?事实上,它是RFC 3696中给出的有效地址的一个例子。

    2. 如果你努力建立一个完美的验证器(有可能),那将是一种浪费。有可能您的电子邮件软件无法全部处理(例如上面的Abc\@def@example.com无法使用大量软件)然后很多有效的电子邮件地址实际上都不正确。

    3. 但无论如何,我得到true运行你的代码,这个bug在别处。