正则表达式:如何扩展域名的正则表达式以包含 a.b.c.d 类型的域?

Regex: How to expand regex for domain name to include domains of type a.b.c.d?

以下正则表达式提取大多数格式为 mail.example.com

的邮件服务器名称
([a-zA-Z0-9-]+\.{1,}[a-zA-Z0-9-]+\.[a-zA-Z0-9-]{2,})

如图here.

我们如何扩展它,使其与一个(或多个)附加子域相匹配,例如

b-app05-06.boldchat.com
ns126a.ba1.enops.net
NHQSDFEXCHUB01.nam.coair.com
ncsmcexchub01.nam.coair.com

您可以将最后一个子模式包含在非捕获组中并设置一个 + 量词:

\b[\w-]+(?:\.[\w-]+){2,}\b

解释:

  • \b - 字边界
  • [\w-]+ - 匹配字母数字或连字符
  • 的字符 class
  • (?:\.[\w-]+){2,} - 匹配 2 个或多个文字点序列和 1 个或多个字母数字字符或连字符的非捕获组
  • \b - 字边界

demo

你可以做得更短:

((?:[a-zA-Z0-9-]+\.)+[a-zA-Z0-9-]{2,})$

Demo

首先,这是匹配一个域的方法(根据您的示例):

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*

顶级域名匹配:

[a-z]{2,}

现在,您可以使用点分隔多个域,然后是顶级域名:

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

Debuggex Demo


如果您需要匹配由至少 2 个子域 + tld 组成的域:

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

Debuggex Demo

如果您的引擎支持正则表达式递归,您可以利用它(通常是 PCRE 兼容引擎)Demo here

此正则表达式适用于任意数量的子域,并允许您捕获内部域。

(([\w-]+)[.](\w{2,}$|(?1))) 详情:

  • (([\w-]+)[.]开始整个递归捕获,然后开始捕获最左边的子域,后跟一个点。
  • (\w{2,}$|(?1)))交替,尝试匹配tdl(匹配结束)或重复模式。

您的主机在第二个捕获组中,它的域在第三个捕获组中。以及第一个捕获组中的整个匹配项(请参阅演示中的替换窗格)