我进行了搜索,发现了许多类似的正则表达式示例,但不是我需要的。
我希望能够传递以下网址并返回结果:
www.google.com 返回 google.com
sub.domains.are.cool.google.com 返回 google.com
doesntmatterhowlongasubdomainis.idont.wantit.google.com 返回 google.com
sub.domain.google.com/no/thanks 返回 google.com
希望有道理:) 在此先感谢!-James
答案 0 :(得分:10)
您不能使用正则表达式执行此操作,因为您不知道后缀中有多少个块。
例如 google.com 的后缀为 com 。要从 subdomain.google.com 转到 google.com ,您必须使用最后两个区块 - 一个用于后缀,一个用于 google 强>
如果您将此逻辑应用于 subdomain.google.co.uk ,但最终会使用 co.uk 。
您实际上需要从http://publicsuffix.org/
这样的列表中查找后缀答案 1 :(得分:7)
不要使用正则表达式,使用.split()方法并从那里开始工作。
var s = domain.split('.');
如果您的用例相当狭窄,您可以根据需要检查TLD,然后根据需要返回最后2或3个段:
return s.slice(-2).join('.');
它会使你的眼睛流血少于任何正则表达式解决方案。
答案 2 :(得分:1)
我没有对此做过很多测试,但如果我明白你的要求,这应该是一个不错的起点......
([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b
修改强>
澄清一下,它正在寻找:
一个或多个字母数字字符或短划线,后跟一个文字点
然后是三件事之一...
并且在结尾处,单词边界(\ b)表示字符串,空格或非单词字符的结尾(正则表达字中的字符通常是字母数字和下划线)。
正如我所说,我没有做太多测试,但这似乎是一个合理的跳跃点。您可能需要尝试并对其进行一些调整,即使这样,您也不可能获得100%的所有测试用例。有一些考虑因素,比如Unicode域名和各种技术上有效但但你很可能不会遇到的东西会像这样惹起一个简单的正则表达式,但这可能会得到你在那里90%以上。
答案 3 :(得分:0)
如果您的数据子集有限,我建议保持正则表达式简单,例如
(([a-z\-]+)(?:\.com|\.fr|\.co.uk))
这将匹配:
www.google.com --> google.com
www.google.co.uk --> google.co.uk
www.foo-bar.com --> foo-bar.com
就我而言,我知道使用此正则表达式将匹配所有相关的URL。
收集样本数据集并针对正则表达式进行测试。在进行原型设计时,您可以使用https://regex101.com/r/aG9uT0/1等工具来实现。在开发中,使用测试脚本自动化它。
答案 4 :(得分:0)
在不测试顶级域有效性的情况下,我使用的是Stormsweeper解决方案的改编:
domain = 'sub.domains.are.cool.google.com'
s = domain.split('.')
tld = s.slice(-2..-1).join('.')