正则从URL中提取一级域名,支持大部分域名
在改造ICP备案系统的同时,优化一些用户体验,其中查询域名ICP备案,只需要使用一级域名查询即可,原系统不会做区分,导致数据有点混乱,今天就要把这个问题解决掉。
ICP备案查询:https://icp.sojson.com
正则思路
基础正则表达式:([a-z0-9--]{1,200})\.([a-z]{2,10})(\.[a-z]{2,10})?
,为了清晰表达就不用替代表达式了。
解说:
1、([a-z0-9--]{1,200})
,域名的主干部分。比如 sojson.com
,就是为了匹配 sojson
部分。
2、\.
,匹配sojson.com
中间的点“.
”。
3、([a-z]{2,10})
,匹配 sojson.com
中的后置“com
”。
4、(\.[a-z]{2,10})?
,匹配如有多级后缀,如sojson.com.cn
的“.cn
”,后面加问好“?
”表示可以有或者没有。
如果有同学测试了就知道,这个不是很合理,因为他会匹配前面的二级、三级域名之类的。因为是从头开始。正则有从后开始的设置,我不会,也测试了下,效果不明显,而且如果当url带参数。https://icp.sojson.com/?q=www.baidu.com
,从后查找就会获取到了www.baidu.com。这明显不是我想要的。
正则长篇大论法
最终我选择了这个,我把国内常用的域名都写清楚。从前往后查找,暂时这么用,有好建议希望提出来。在下面留言。
直接上代码:
public static void main(String[] args) {
String url = "https://www.sojson.com/regex/generate";
String pattern = "([a-z0-9--]{1,200})\\.(ac.cn|bj.cn|sh.cn|tj.cn|cq.cn|he.cn|sn.cn|sx.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|zj.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sc.cn|gz.cn|yn.cn|gs.cn|qh.cn|nx.cn|xj.cn|tw.cn|hk.cn|mo.cn|xz.cn" +
"|com.cn|net.cn|org.cn|gov.cn|我爱你|在线|中国|网址|网店|中文网|公司|网络|集团" +
"|com|cn|cc|org|net|xin|xyz|vip|shop|top|club|wang|fun|info|online|tech|store|site|ltd|ink|biz|group|link|work|pro|mobi|ren|kim|name|tv|red" +
"|cool|team|live|pub|company|zone|today|video|art|chat|gold|guru|show|life|love|email|fund|city|plus|design|social|center|world|auto)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(url);
while (m.find()){
url = m.group();
}
System.out.println(url);
}
有个小注意点,需要把多级结尾的域名写在前面。因为正则匹配也是从前往后匹配的。
可能有的人不知道,gx.cn
这种结尾的是什么,是我国各种省份的域名,比如gx.cn
就是广西省的。
优化版
还是有点问题,用获取Host
方式,再次加工了一次。封装后代码如下:
/**
* 从URL中从前到后提取 一级域名
* @param url
* @return
*/
public static String getDomainByUrl(String url){
if(isBlank(url)){
return url;
}
String pattern = "([a-z0-9--]{1,200})\\.(ac.cn|bj.cn|sh.cn|tj.cn|cq.cn|he.cn|sn.cn|sx.cn|nm.cn|ln.cn|jl.cn|hl.cn|js.cn|zj.cn|ah.cn|fj.cn|jx.cn|sd.cn|ha.cn|hb.cn|hn.cn|gd.cn|gx.cn|hi.cn|sc.cn|gz.cn|yn.cn|gs.cn|qh.cn|nx.cn|xj.cn|tw.cn|hk.cn|mo.cn|xz.cn" +
"|com.cn|net.cn|org.cn|gov.cn|.com.hk|我爱你|在线|中国|网址|网店|中文网|公司|网络|集团" +
"|com|cn|cc|org|net|xin|xyz|vip|shop|top|club|wang|fun|info|online|tech|store|site|ltd|ink|biz|group|link|work|pro|mobi|ren|kim|name|tv|red" +
"|cool|team|live|pub|company|zone|today|video|art|chat|gold|guru|show|life|love|email|fund|city|plus|design|social|center|world|auto|.rip|.ceo|.sale|.hk|.io|.gg|.tm|.gs|.us)$";
if(url.startsWith("http:")||url.startsWith("https:")){
url = getHost(url);
}else{
url = getHost("http://" +url);
}
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(url);
while (m.find()){
url = m.group();
}
return url;
}
有好的建议在下面留言。谢谢!
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/276.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。