C# 验证基于UTF8字符的电子邮件
我尝试使用以下正则表达式验证电子邮件(UTF8)C# 验证基于UTF8字符的电子邮件,c#,email-validation,C#,Email Validation,我尝试使用以下正则表达式验证电子邮件(UTF8) Regex.IsMatch(电子邮件地址, @“([\w-\.]+)@(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.}.[0-9]{1,3}.\)([\w-]+\.+)([a-zA-Z]{2,4}.[0-9]{1,3}.$”,RegexOptions.CultureInvariant) 它返回false表示“ä”pfel@domain.com“ 任何关于如何改进的建议。简单的答案是,你不想这样做:正则表达式是验证电子邮件
Regex.IsMatch(电子邮件地址,
@“([\w-\.]+)@(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.}.[0-9]{1,3}.\)([\w-]+\.+)([a-zA-Z]{2,4}.[0-9]{1,3}.$”,RegexOptions.CultureInvariant)代码>
它返回false表示“ä”pfel@domain.com“
任何关于如何改进的建议。简单的答案是,你不想这样做:正则表达式是验证电子邮件地址的可怕方式
您的具体问题的答案是,如果您愿意阻止有效地址并允许无效地址,您希望使用[\p{L}\p{M}\p{N}]
而不是\w
来匹配地址用户名部分的Unicode单词字符
UTF-8与此无关,您正在验证字符串,而不是其特定编码
您的正则表达式实际上为“ä返回truepfel@domain.com“
(带或不带CultureInvariant
选项)。尝试Console.Write(Regex.IsMatch(“äpfel@domain.com“,@”^([\w-\.]+)@(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[124;([\ w-]+])([a-zA-Z]{2,4}{124;[0-9]{1,3}.(\]?)$”,RegexOptions.CultureInvariant))代码>本身,您将获得true
您将在所有IDN上失败,如info@οñτοπα.Δπθ.gr
,如果您关心非ASCiI限制的电子邮件地址,您可能希望包括它们。(如果你想排除被禁止的混淆,你会变得非常复杂)
其他人指出,使用正则表达式验证电子邮件存在一些问题,但这些问题归结为:
实际的电子邮件语法比人们想象的要复杂(甚至在我们处理非ASCII扩展之前)。e、 你知道Abc吗\@def@example.com
是有效的电子邮件地址吗?事实上,这是RFC3696中给出的有效地址的一个例子
Abc)\@def@example.com
以上内容无法与许多软件配合使用)然后许多有效的电子邮件地址实际上就不正确了但是无论如何,我运行你的代码时得到了
true
,错误在别处。请参阅使用regex验证电子邮件比看起来更复杂:@StevieB谢谢,我已经浏览了链接。但我认为将选项设置为“RegexOptions.CultureInvariant”并在regex中指定“\w”将验证所有UTF8单词。为什么您认为regex是验证电子邮件地址的可怕方式?你有什么更好的解决方案吗?电子邮件地址的完整合法语法构成了一个极其复杂的正则表达式(我见过的最简单的符合RFC-822的正则表达式只有一页半长)。如果你想检查一个地址是否有效,只需给它发送一封电子邮件,看看它是否会反弹。状态机更适合这个任务。当然会更详细一点。@Mark,当然,但它不可扩展。。。很难构建正确的正则表达式,但只要你有它,它就会运行得很好。@StevieB,正则表达式只是在幕后生成一个状态机;)感谢您为我指出了正确的方向,由于编码问题,我收到了不正确的电子邮件字符串。