我正在尝试使用以下正则表达式验证电子邮件(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。
有关如何改进它的任何建议。
答案 0 :(得分:0)
简单的答案是你不想这样做:正则表达式是一种验证电子邮件地址的可怕方式。
您的具体问题的答案是,如果您愿意阻止有效地址并允许无效地址,您希望使用[\p{L}\p{M}\p{N}]
而不是\w
来匹配用户名部分中的Unicode字符字符地址。
答案 1 :(得分:0)
UTF-8与此无关,您正在验证字符串,而不是其特定的编码。
您的正则表达式实际上为"ä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
。
您将在info@ουτοπία.δπθ.gr
等所有IDN上失败,如果您关心非ASCiI限制的电子邮件地址,您可能希望将其包括在内。 (如果你想排除被禁止的混淆,你会变得非常复杂)。
其他人使用正则表达式验证电子邮件时遇到了问题,但归结为:
实际的电子邮件语法比人们想象的要复杂得多(甚至在我们处理非ASCII扩展之前)。例如你知道Abc\@def@example.com
是有效的电子邮件地址吗?事实上,它是RFC 3696中给出的有效地址的一个例子。
如果你努力建立一个完美的验证器(有可能),那将是一种浪费。有可能您的电子邮件软件无法全部处理(例如上面的Abc\@def@example.com
无法使用大量软件)然后很多有效的电子邮件地址实际上都不正确。
但无论如何,我得到true
运行你的代码,这个bug在别处。