请求修复正则表达式,精准提取不含子域名、路径的主域名
修复正则表达式以精准提取主域名(排除子域、路径)
嘿,我来帮你搞定这个正则的问题!你之前写的正则只能匹配不带路径的URL,一旦URL后面带了文件夹或者文件名就匹配失败,而且没考虑到多级子域、协议这些情况对吧?咱们来调整一下,让它能覆盖所有你提到的URL变体,精准提取出你想要的主域名。
原正则的问题分析
你之前的正则:/([a-zA-Z0-9-]+)(\.[a-zA-Z]{2,5})?(\.[a-zA-Z]+$)
它的核心问题是用了$锚定字符串结尾,这就导致一旦URL后面有路径(比如/blog或者/file.html),正则就会匹配失败,因为结尾变成了路径内容而不是域名。另外它也没处理HTTP/HTTPS协议、多级子域名的排除逻辑。
修复后的正则表达式
这里给你一个适配所有场景的正则:
/(?:https?:\/\/)?(?:www\.|[\w-]+\.)*([\w-]+\.(?:[a-zA-Z]{2,}|[a-zA-Z]{2,}\.[a-zA-Z]{2,}))(?=\/|$)/
正则各部分解释
(?:https?:\/\/)?:匹配可选的HTTP/HTTPS协议,用非捕获组(?:...)避免把协议部分算进提取结果里(?:www\.|[\w-]+\.)*:匹配任意多级子域名(包括www.、api.这种),同样用非捕获组排除这些子域,只保留主域名部分([\w-]+\.(?:[a-zA-Z]{2,}|[a-zA-Z]{2,}\.[a-zA-Z]{2,})):这是核心的捕获组,用来提取主域名,既支持domain.com这种二级域名,也支持masterdomain.com.au、luxury.co.uk这种带国家顶级域名的组合(?=\/|$):正向预查,确保匹配到主域名后,后面要么是路径的起始斜杠/,要么是字符串结尾,这样就会自动忽略后面的文件夹、文件名内容
测试验证
用你提到的所有URL变体测试,都能精准提取到目标主域名:
http://domain.com→ 提取结果:domain.comhttps://www.masterdomain.com.au→ 提取结果:masterdomain.com.auhttps://api.luxury.co.uk→ 提取结果:luxury.co.ukglobo.us/→ 提取结果:globo.ustest.com/path/to/file.html→ 提取结果:test.comhttps://sub.sub.google.com.br→ 提取结果:google.com.brwww.example.org/blog→ 提取结果:example.org
小提示
如果遇到一些特殊的超长顶级域名(比如.app、.dev之外的更长后缀),可以把正则里的[a-zA-Z]{2,}调整为[a-zA-Z]{2,6},这样能覆盖更多罕见的顶级域名情况。
内容的提问来源于stack exchange,提问作者user3352263
相关产品推荐
相关产品推荐

