用于匹配电子邮件的域部分的最佳正则表达式

时间:2015-05-29 15:11:26

标签: javascript regex

我正在尝试创建一个可以匹配电子邮件地址的域部分的RegEx。现在我必须使用其中两个,一个获取所有电子邮件地址,然后另一个匹配域名,但我仍然遇到问题。

现在我的代码是:

var email_ex = /[a-zA-Z0-9]+(?:(\.|_)[A-Za-z0-9!#$%&'*+/=?^`{|}~-]+)*@(?!([a-zA-Z0-9]*\.[a-zA-Z0-9]*\.[a-zA-Z0-9]*\.))(?:[A-Za-z0-9](?:[a-zA-Z0-9-]*[A-Za-z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/ig; // Match all email addresses on page
    email_ex = new RegExp(email_ex);

    var domain_ex = /[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|CO\.UK|AU|LI|LY|IT|IO)/ig // Match all domains
    domain_ex = new RegExp(domain_ex);

    var match = document.body.innerText; // Location to pull our text from. In this case it's the whole body
    match = match.match(email_ex); // Run the RegExp on the body's textContent

我宁愿不必列出TLD列表,但我找不到足够好的表达

5 个答案:

答案 0 :(得分:4)

最简单的RegExp:/@([^\s]*)/

var email = "test@example.domain";
var domain = email.match(/@([^\s]*)/)[1];

答案 1 :(得分:1)

如果您不希望正则表达式找到有效的电子邮件地址,因为您可以预先确定您有一个(如果电子邮件地址是一个网页,它们大多数有效),您可以使用此:

域名不能包含@' s你可以使用所有字符直到最后@

(.*)@(.*)

你可以确定你的域名在第二组

答案 2 :(得分:1)

+1 @strah,答案很有效,但对于这个例子“@ example.domain”,返回的是“example.domain”,在我看来,它应该为null,因为它不是有效的电子邮件。 / p>

如果您想对电子邮件格式格外严格,可以按照以下步骤操作:

var r = /[^\s]+@([^\s]+)/;
r.exec("d@testing.domain")[1]; //outputs: testing.domain
r.exec("@testing.domain")[1]; //outputs: null

答案 3 :(得分:0)

我同意您不应该有TLD列表。您的正则表达式已经遗漏了很多,随着通用TLD变得越来越普遍,这将成为一个非常长的列表。这应该让你非常接近:

(?<=@)(?:[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,}

或评论:

(?<=@)                              (?# Check it is preceeded with @ )
(?:                                 (?# start of subdomain block )
[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9] (?# subdomain )
\.)+                                (?# end of subdomain, including dot, repeats )
[a-zA-Z0-9]{2,}                     (?# TLD )

答案 4 :(得分:0)

您应该能够结合查找电子邮件和捕获 单个操作中的域部分和单个正则表达式。

使用html5规范中的正则表达式作为示例,但使用你的 然后只需插入捕获组。

 # http://www.w3.org/TR/html5/forms.html#valid-e-mail-address
 # /[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)/


 [a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+ 
 @
 (                                  # (1 start)
      [a-zA-Z0-9] 
      (?:
           [a-zA-Z0-9-]{0,61} 
           [a-zA-Z0-9] 
      )?
      (?:
           \. 
           [a-zA-Z0-9] 
           (?:
                [a-zA-Z0-9-]{0,61} 
                [a-zA-Z0-9] 
           )?
      )*
 )                                  # (1 end)