【问题标题】:Regex: Email validation that allows only hyphens in the middle of the domain and top-level domain正则表达式:仅允许在域和顶级域中间使用连字符的电子邮件验证
【发布时间】:2014-07-10 21:59:42
【问题描述】:

我知道这已经被问过很多次了,但我没有找到真正满足电子邮件地址必须满足的所有条件才能被视为有效的任何内容。

考虑以下作为电子邮件地址的结构:

part1@part2.part3.part4
  • part1=用户名

  • part2=域

  • part3 and part4 =顶级域名

这些都是必须满足的条件:

  1. 电子邮件地址不得接受空格
  2. 电子邮件地址不得以点或字母或数字以外的字符结尾
  3. 只允许使用一个 @ 符号
  4. at 符号前后不能有特殊字符
  5. 域点前后不能有特殊字符(电子邮件地址的part2后面的点)
  6. 您不能在用户名中连续输入两个或多个点
  7. 在域中,@ 和点之间,@ 和点旁边的字符必须是字母或数字,中间唯一允许的特殊字符是连字符。
  8. 第 7 步同样适用于顶级域(第 3 部分和第 4 部分或电子邮件)

这是我目前使用的正则表达式:

^([\w\.\-]+)@([\w\-]+)((\.(\w){2,9})+)$

但不满足条件:4、5、6、7和8

我只是想弄清楚如何补充我的正则表达式并在此过程中学习。

编辑

电子邮件地址中唯一允许的特殊字符是:点、连字符、下划线和 at 符号

这是无效电子邮件列表

mkyong - 必须包含“@”符号

mkyong123@.com – 域不能以点“.”开头

mkyong()*@gmail.com - 电子邮件只允许使用字符、数字、下划线和破折号

mkyong@%*.com – 电子邮件的 tld 只允许字符和数字

mkyong..2002@gmail.com – 双点“。”不允许

mkyong.@gmail.com – 电子邮件的最后一个字符不能以点“.”结尾

mkyong@mkyong@gmail.com – 不允许使用双“@”

mkyong@gmail.com.1a -email 的 tld 有两个字符不能包含数字

有效:

mkyong@yahoo.com

mkyong-100@yahoo.com

mkyong.100@yahoo.com

mkyong111@mkyong.com

mkyong-100@mkyong.net

mkyong.100@mkyong.com.au

mkyong@1.com

mkyong@gmail.com.com

mkyong-100@yahoo-test.com

【问题讨论】:

  • /[a-z0-9!#$%&'*+/=?^_{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g 来自regexr.com/2rhq7
  • 你使用什么语言?
  • javascript。我也想用 C# 在服务器中进行验证,但我认为 javascript 就绰绰有余了
  • 您前段时间向我寻求帮助,能否请您提供一组有效和无效的电子邮件地址,以便我可以测试我的正则表达式。谢谢
  • @sshashank124 我在我的问题中添加了一些示例,请看一下

标签: javascript regex email


【解决方案1】:

电子邮件地址确实具有可以表示为正则表达式的特定格式。来自RFC 5322的官方格式是:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]      |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@ (?:(?:a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?  |  \[(?:(?:25[0-5]|2[0-]0-9]|[01]?[0-9][0-9]?)\.){3}       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-]:          ?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Jan Goyvaertsregular expressions don't send emails 所示,因此您实际上无法知道它是无效的,直到电子邮件被发送并且收件人没有收到。

由于您正在以自己的方式调整电子邮件正则表达式,因此它并不正确。它可能会满足您使用该格式的要求,但电子邮件是固定格式,因此只需使用参考格式或简化格式,例如Regular-Expressions 页面上列出的格式。否则,这个问题将永远无法满足您的确切要求。

【讨论】:

  • 但我的要求很具体。我不打算为所有可能的电子邮件地址获取正则表达式
  • 但是电子邮件地址已经是固定格式了吗?为什么不使用标准的?
  • 我知道他们不是。我不使用标准,因为标准没有做我需要正则表达式做的事情。
【解决方案2】:

电子邮件地址不得接受空格

不,"this is"@a-valid-e-mail-address.com

只允许一个@符号

不,"this@is"@a-valid-e-mail-address.com

at 符号前后不能有特殊字符

我不确定这意味着什么,但可能不是真的。 !#$%&'*+-/=?^_`{}|~@example.org 很好。

域名点前后不能有特殊字符(邮件地址的part2后面的点)

does@ţḩıš.çóûñţ?因为它是一个有效的电子邮件地址。

您不能在用户名中连续输入两个或多个点

can(...)too@localhost

Don’t use regular expressions to validate e-mail addresses, please.

【讨论】:

  • 我知道,但我唯一想要和需要的就是找到一种方法来满足我在问题中列出的所有条件:(
  • @Axel:为什么?在什么情况下您希望匹配几乎所有有效的电子邮件地址?
  • 我从来没有说过我想要那样。我只是想为我的问题中列出的所有条件制作一个正则表达式。就是这样。
【解决方案3】:

根据您的有效和无效电子邮件地址列表,这是我所能做的最好的事情:

^([\w-]|(?<!\.)\.)+[a-zA-Z0-9]@[a-zA-Z0-9]([\w\-]+)((\.([a-zA-Z]){2,9})+)$

DEMO

更新:

^([\w-]|(?<!\.)\.)+[a-zA-Z0-9]@[a-zA-Z0-9]([a-zA-Z0-9\-]+)((\.([a-zA-Z]){2,9}){0‌​,2})$

【讨论】:

  • 域仍然允许我输入下划线,所以我必须将其更改为:^([\w-]|(?
  • 只是最后一个问题。是否有可能允许在 tld 中间使用连字符。这就是条件 8 所说的,即最少 2 个字符(只有字母或数字)。如果超过 2 个字符,则中间只允许使用连字符
  • 示例:aaa@bbb.co.pe(tld 中只有 2 个字符)| bbb@bbb.c-c.p-e(tld 中超过 2 个字符,中间允许使用连字符)| ccc@bbb.cd--d-d.pe-8-ee(tld中超过2个字符,中间允许连字符)
  • @eddy,我在上面的 cmets 中发布了一些链接。他们为 OP 解决了问题。
  • @sshashank124 嗨,我知道已经很久了,但我尝试在 asp.net 中使用你的正则表达式,但我收到了这个错误:“SyntaxError: invalid quantifier”。我检查了您的演示,发现当我将 Flavor 更改为 JavaScript 时它不起作用。我认为问题出在这部分:(?&lt;!\.)。你觉得你能帮我一把吗?
猜你喜欢
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多