正则表达式条件提取电子邮件地址的域名

regular expression conditional to extract domain name of email address

我想提取电子邮件地址的域名,但只提取域名前的部分。

@([\w]+)

使用“john@telenet.be”这样的电子邮件地址,我可以提取 telenet。但是,当电子邮件地址是“john@invoice.telenet.be”时,我得到的是“invoice”而不是“telenet”。

我尝试了一个条件,但我无法让它工作。

根据定义有效电子邮件地址格式的 rfc522,电子邮件地址的 本地部分 ,即 [=46= 之前的部分]@domain_name,如果它位于 引号字符串 中,则可以包含“@”字符。因此,您要确保在 final '@'.

之后开始扫描

以下正则表达式是特定的,将扫描到域名的倒数第二个捕获组 1:

[@.]([^.@]+)\.([^.@]+)$
  1. [@.] - 匹配“@”或“.”。这与新域级别的开始相匹配。正则表达式的其余部分将保证要扫描的剩余字符中没有'@'字符。
  2. ([^.@]+) - 扫描以捕获组 1 中的一个或多个字符,这些字符要么是“.”,要么是“.”。也不是'@'。
  3. . - 匹配 '.'.
  4. ([^.@]+) - 匹配一个或多个“.”字符也不是'@'。
  5. $ - 匹配字符串的结尾。

See Regex demo.

第二种方法使用更简单的正则表达式首先扫描最后的“@”后面的任何内容以捕获完整域:

(?<=@)[^@]+$
  1. (?<=@) - 一个积极的回顾断言,指出前面的字符是“@”。
  2. [^@]+ - 匹配 1 个或多个非“@”字符。
  3. $ - 匹配字符串的结尾。

See Regex Demo

如果您的正则表达式引擎不支持后向断言,请改用以下正则表达式,在这种情况下域将位于捕获组 1 中:

@([^@]+)$

然后你可以在 . 字符和 select 域的任何 N 部分拆分扫描域,如下所示(代码是 Python):

import re

email = "john@invoice.telenet.be"

m = re.search(r'@([^@]+)$', email)
if m:
    # We have a match
    domain = m.group(0)
    domain_parts = domain.split('.')
    # the penultimate part: 'telnet'
    print(domain_parts[-2])
    # the last 2 parts: telnet.be
    print('.'.join(domain_parts[-2:]))

打印:

telenet
telenet.be

See Python demo