正则表达式:电子邮件验证,只允许在域和顶级域中间使用连字符

时间:2014-05-22 02:56:42

标签: javascript regex email

我知道之前有过很多次询问,但我没有发现任何真正符合电子邮件地址必须满足的条件才能被视为有效的内容。

将以下内容视为电子邮件地址的结构:

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

  • 2部分=域

  • part3和part4 =顶级域名

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

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

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

    但它不符合条件:4,5,6,7和8

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

    修改

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

    以下是无效电子邮件列表

    mkyong - 必须包含“@”符号

    mkyong123 @ .com - 域名不能以点“。”开头。

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

    mkyong @%*。com - email的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

3 个答案:

答案 0 :(得分: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})$

答案 1 :(得分:2)

  

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

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

  

只允许使用一个@符号

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

  

在符号

之前或之后不能有特殊字符

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

  

域点之前或之后不能有特殊字符(电子邮件地址第2部分后面的点)

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

  

您无法在用户名

中连续输入两个或多个点

can(...)too@localhost

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

答案 2 :(得分:0)

电子邮件地址确实具有可以表示为正则表达式的特定格式。 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页面上列出的文件。否则,这个问题永远无法满足您的确切要求。