使用正则表达式从URL中提取顶级域和二级域

时间:2014-01-16 21:56:48

标签: regex url dns

如何使用正则表达式从URL中仅提取顶级域名和二级域名?我想跳过所有较低级别的域名。有什么想法吗?

9 个答案:

答案 0 :(得分:18)

这是我的想法,

使用$锚从行末处匹配任何非点数的三次。

字符串末尾的最后一个匹配项应该是可选的,以允许.com.au.co.nz类型的域名。

最后和最后一个匹配项只匹配2-3个字符,因此不会将其与二级域名混淆。


<强>正则表达式:

[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$


<强>演示:

Regex101 Example

答案 1 :(得分:6)

你可以用这个:

(\w+\.\w+)$

如果没有更多详细信息(示例文件,您正在使用的语言),很难确切知道这是否有效。

示例:http://regex101.com/r/wD8eP2

答案 2 :(得分:1)

对于任何使用JavaScript并希望以简单方式提取顶级和二级域名的人,我最终都这样做了:

'example.aus.com'.match(/\.\w{2,3}\b/g).join('')

这匹配任何一个句点,后跟两个或三个字符,然后是word boundary

以下是一些示例输出:

'example.aus.com'       // .aus.com
'example.austin.com'    // .com
'example.aus.com/howdy' // .aus.com
'example.co.uk/howdy'   // .co.uk

有些人可能需要更聪明的东西,但这对我来说对我的特定数据集来说已经足够了。

修改

我意识到实际上有不少的二级域名超过3个字符(并且允许)。所以,为了简单起见,我只删除了我的正则表达式的字符计数元素:

'example.aus.com'.match(/\.\w*\b/g).join('')

答案 3 :(得分:0)

使用捕获组可以获得一些魔法。

例如,请考虑以下javascript:

let hostname = 'test.something.else.be';
let domain = hostname.replace(/^.+\.([^\.]+\.[^\.]+)$/, '$1');

document.write(domain);

这将导致包含'else.com'的字符串。这是因为正则表达式本身将匹配完整的字符串,捕获组将映射到$1。因此,它将完整的字符串'test.something.else.com'替换为实际为'$1'的{​​{1}}。

正则表达式并不漂亮,可以使用'else.com'之类的东西来定义更加动态,以定义要查找子域的深度级别,但这只是一个例子。

答案 4 :(得分:0)

如果需要所有特定的顶级域名,则可以编写如下正则表达式:

{
  "DEV": [
    {
      "GitEmail": "asd@asd.com"
    }
  ],
  "TEST": [
    {
      "GitEmail": "asd1@asd.com"
    }
  ],
  "PROD": [
    {
      "GitEmail": "asd2@asd.com"
    }
  ]
}  

您还可以通过此链接添加更多域名:

https://www.icann.org/resources/pages/tlds-2012-02-25-en

答案 5 :(得分:0)

此外,您可能可以使用类似于以下内容的表达式来做到这一点

^(?:https?:\/\/)(?:w{3}\.)?.*?([^.\r\n\/]+\.)([^.\r\n\/]+\.[^.\r\n\/]{2,6}(?:\.[^.\r\n\/]{2,6})?).*$

并添加与捕获URL组成部分一样多的捕获组。

Demo


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 6 :(得分:0)

以下正则表达式将一个域与一个从URL或域字符串中提取的root和tld(命名为捕获组)相匹配:

(?:\w+:\/{2})?(?<cs_domain>(?<cs_domain_sub>(?:[\w\-]+\.)*?)(?<cs_domain_root>[\w\-]+(?<cs_domain_tld>(?:\.\w{2})?(?:\.\w{2,3}|\.xn-+\w+|\.site|\.club))))\|

很难说它是否完美,但是它适用于我所针对的所有测试数据集,包括.club,.xn-1234,.co.uk和其他奇数结尾。而且它以5556个步骤针对40k个原木字符进行处理,因此效率似乎也很合理。

答案 7 :(得分:-2)

由于顶级域名现在包含超过三个字符的内容,例如.wang和.travel,这里有一个满足这些新顶级域名的正则表达式:

([^.\s]+\.[^.\s]+)$

策略:从字符串末尾开始,查找一个或多个不是句点或空格的字符,后跟一个句点,后跟一个或多个不是句点或空格的字符。

http://regexr.com/3bmb3

答案 8 :(得分:-2)

如果您需要更具体:

/\.(?:nl|se|no|es|milru|fr|es|uk|ca|de|jp|au|us|ch|it|io|org|com|net|int|edu|mil|arpa)/

基于http://www.seobythesea.com/2006/01/googles-most-popular-and-least-popular-top-level-domains/