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

Best regular expression for matching the domain part of emails

本文关键字:最佳 正则表达式 域部 电子邮件      更新时间:2023-09-26

我试图使一个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

我宁愿没有顶级域名的列表,但我还没能找到一个足够好的表达式

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

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

如果你不想让一个正则表达式找到一个有效的电子邮件地址,因为你可以预先确定你有一个(如果电子邮件地址是一个网页,他们大多是有效的),你可以使用这个:

域不能包含@,但可以占用所有字符,直到最后一个@

(.*)@(.*)

,你可以确保你的域名在第二组

+1对于@strah,答案很好,但是对于这个示例"@example "。域"返回是"的例子。域名",在我看来,它应该是空的,因为它不是一个有效的电子邮件。

如果你想对电子邮件的格式要求更严格,你可以这样做:

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

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

(?<=@)(?:[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 )

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

使用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)