正则表达式仅匹配来自任何电子邮件地址的最终域名

RegEx match only final domain name from any email address

我想匹配 来自电子邮件地址的父域名,该电子邮件地址可能有也可能没有子域。

到目前为止我试过这个:

new RegExp(/.+@(:?.+\..+)/);

结果:

Input: abc@subdomain.maindomain.com
Output: ["abc@subdomain.domain.com", "subdomain.maindomain.com"]

Input: abc@maindomain.com
Output: ["abc@maindomain.com", "maindomain.com"]

我对第二场比赛(小组赛)感兴趣
我的 objective 是,在这两种情况下,我希望组匹配并只给我 maindomain.com

注意:在否决票之前,请注意我既不能使用现有的答案,也不能匹配现有的问题。

您可以使用一个简单的正则表达式来仅获取域名的最后 2 部分是

/[^.]+\.[^.]$/

它匹配一个非句点字符序列,然后是句点和另一个非句点序列,都在字符串的末尾。此正则表达式不能确保此域名出现在“@”之后。如果你想制作一个也能做到这一点的正则表达式,你可以使用延迟匹配 "*?":

/@.*?([^.]+\.[^.])$/

但是,我认为尝试一次完成所有事情往往会使 make 正则表达式更加复杂且难以阅读。在这个问题中,我宁愿分两步做事:首先检查电子邮件中是否有“@”。然后你得到“@”后面的部分并将它传递给简单的正则表达式,它将提取域名。

将事物分开的一个好处是一些更改更容易。例如,如果你想确保你的电子邮件中只有一个“@”,它很容易在单独的步骤中完成,但在 "do everything" 正则表达式中实现起来会很棘手。

您可以使用这个正则表达式:

/@(?:[^.\s]+\.)*([^.\s]+\.[^.\s]+)$/gm

使用捕获的第 1 组作为结果。

  • 它匹配 @ 后跟 0 个或多个非 DOT 文本实例和一个 DOT,即 (?:[^.\s]+\.)*.
  • 使用 ([^.\s]+\.[^.\s]+)$ 它匹配并捕获由 DOT 分隔的最后 2 个组件。

RegEx Demo

对于下面的 maindomain 应该总是 return 字符串的 maindomain.com 位。

var pattern = new RegExp(/(?:[\.@])(\w[\w-]*\w\.\w*)$/);

var str = "abc@subdomain.maindomain.com";
var maindomain = str.match(pattern)[1];

http://codepen.io/anon/pen/RRvWkr

编辑:调整为不允许以连字符开头的域,即 - '-yahoo.com'