【问题标题】:regular expression conditional to extract domain name of email address正则表达式条件提取电子邮件地址的域名
【发布时间】:2022-01-26 12:11:17
【问题描述】:

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

@([\w]+)

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

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

【问题讨论】:

  • 试试这个:@(.+)\. 这里是例子:regex101.com/r/v3v896/1
  • 除非您有有效 TLD 列表,否则您的任务是徒劳的。想一想,你会如何处理john@invoice.telenet.co.uk
  • 无论如何,[^.@]+(?=\.[^.]+$) 将适用于您的具体示例。 regex101.com/r/FLd4nj/1

标签: regex conditional-statements


【解决方案1】:

根据rfc522,它定义了有效电子邮件地址的格式,电子邮件地址的本地部分,即@domain_name之前的部分,可以如果它在 引用的字符串中,则包含一个“@”字符。因此,您要确保在 final '@' 之后开始扫描。

以下正则表达式是特定的,将扫描到域名最后一级的下一个捕获组 1:

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

See Regex demo.

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

(?<=@)[^@]+$
  1. (?&lt;=@) - 一个肯定的后向断言,说明前面的字符是“@”。
  2. [^@]+ - 匹配 1 个或多个非“@”字符。
  3. $ - 匹配字符串的结尾。

See Regex Demo

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

@([^@]+)$

然后你可以在.字符上分割扫描到的域,并选择域的任意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

【讨论】:

  • 感谢您的详细解释!!非常有帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多