Regex 域和扩展的正则表达式可以';不能处理双字扩展名
我正在努力使这个正则表达式在非简单域上工作Regex 域和扩展的正则表达式可以';不能处理双字扩展名,regex,Regex,我正在努力使这个正则表达式在非简单域上工作 ((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)? 因此,在上面的示例中,它将域识别为google,将扩展名识别为.com 但如果它是一个双字扩展名,它将被忽略: http://www.google.com.hk 在上面的示例中,域被视为.com,扩展名被视为.hk 你知道我如何调整正则表达式来理解.com.hk样式扩展吗 谢谢。
((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)?
因此,在上面的示例中,它将域识别为google
,将扩展名识别为.com
但如果它是一个双字扩展名,它将被忽略:
http://www.google.com.hk
在上面的示例中,域被视为.com
,扩展名被视为.hk
你知道我如何调整正则表达式来理解.com.hk
样式扩展吗
谢谢。试试这个-*\:\/\/(?:www\)([^\/]+)
这将匹配示例中的扩展。它在a/或空格处停止。允许可选的“点然后字”作为扩展的一部分:
((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)?
((https?):\/\/)?(\w+)(\P\w+)。(\P\w+(\.\w+))(\/.*)?
我还从url第一部分的捕获中删除了
*
量词。没有与域名相关的扩展概念,只有FQDN(完全限定域名)、TLD(顶级域)、标签和子域
如果我举你最后一个例子http://www.google.com.hk
:
,www
,google
,com
都是标签hk
是一个域名,FQDNwww.google.com.hk
是一个域,因为它是最后一个域,所以它是TLDhk
是com.hk
子域hk
是一个google.com.hk
子域com.hk
是一个www.google.com.hk
子域google.com.hk
com
在这里没有什么特别的,可以是任何东西。它没有TLD的约束(TLD不能是任何东西,您可以找到一个列表)
结论com.hk
与google.hk
,google.com
,pizza.org
,org.pizza
(是的,TLDpizza
存在)没有什么不同,它们都有两个标签,由一个点分隔:TLD及其子域
注:有时最后两个标签称为SLD(二级域)
无论您使用何种语言,如果出于以下两个主要原因想要解析URL,regex都不是一个好办法:
- URL语法比您想象的要复杂
- 大多数语言都已经有了这样的工具(Python中的
,PHP中的urllib.parse
,C中的parse\u url
类,java中的URI
,nodejs中的url模块……)java.net.url
之后,您需要首先检查此主机名是否为IPv4,因为在这种情况下,dots的含义不相同(这里没有将FQDN拆分为标签,而是将四个数字分开),或者是IPv6 然后只需拆分主机名并获取最后一项即可获得TLD。您可以将其余的项连接回主机名,以获取主机名的“子域部分” 如果您的目标是分离TLD列表末尾的所有标签,则必须以您希望的方式在代码中包含此列表,并检查是否有来自末尾的项
但再一次,域名中没有“扩展名”,甚至更少有“双字扩展名”。请参考此链接。希望它能起作用。不,那个链接不起作用。干杯。试试这个-
*\:\/\/(?:www\)([^\/]+)
来自@KarthickKumaramakrishnan的链接可以工作,我认为这是一个很好的解决方案@sideroxylon,谢谢。
((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)?