【问题标题】:Validating UTF8 characters based emails [duplicate]验证基于 UTF8 字符的电子邮件 [重复]
【发布时间】:2014-02-06 12:47:39
【问题描述】:

我正在尝试使用以下正则表达式验证电子邮件 (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。

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

【问题讨论】:

标签: c# email-validation


【解决方案1】:
  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. 您将在所有 IDN(如 info@ουτοπία.δπθ.gr)上失败,如果您关心非 ASCII 限制的电子邮件地址,您可能希望包含它们。 (如果你想排除被禁止的混淆,你会变得非常复杂)。

其他人使用正则表达式验证电子邮件存在问题,但归结为:

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

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

但无论如何,我得到true 运行你的代码,错误在别处。

【讨论】:

  • 感谢您为我指明正确的方向,由于编码问题,我收到了不正确的电子邮件字符串。
【解决方案2】:

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

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

【讨论】:

  • 为什么你认为正则表达式是一种可怕的验证电子邮件地址的方法?您有什么更好的解决方案建议?
  • 电子邮件地址的完整合法语法使得正则表达式非常复杂(我见过的最简单的符合 RFC-822 标准的就是一页半长)。如果您想检查一个地址是否有效,只需向它发送一封电子邮件,看看它是否被退回。
  • 状态机更适合这项任务。当然要详细一点。
  • @Mark,当然,但它不可扩展...很难构建正确的正则表达式,但你拥有它,它工作得很好。
  • @StevieB,正则表达式只是在后台生成状态机;)
猜你喜欢
  • 1970-01-01
  • 2011-07-16
  • 2011-06-21
  • 2013-09-25
  • 2012-05-20
  • 2013-01-18
  • 2013-02-12
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多