请求分步解析Redshift中提取URL域名的正则表达式
Redshift提取URL域名的正则表达式分步解析
先看整体SQL逻辑:
REPLACE(REGEXP_SUBSTR(url,'//[^/\\\,=\\@\\+]+\\.[^/:;,\\\\\\(\\)]+'),'//','')
先用REGEXP_SUBSTR从url字段里匹配出带//前缀的域名片段,再用REPLACE把开头的//删掉,得到纯域名。
下面分步拆解核心的正则表达式://[^/\\\,=\\@\\+]+\\.[^/:;,\\\\\\(\\)]+
第一部分:
//
直接匹配URL里协议(比如http/https)后的双斜杠分隔符,定位域名的起始位置。第二部分:
[^/\\\,=\\@\\+]+[^...]是反向字符集,和你了解的正向字符集[]相反,意思是匹配不在这个集合里的任意单个字符- 里面的
\\/、\\,、\\=、\\@、\\+都是转义后的特殊字符:因为/、,、=、@、+要么在正则里有特殊含义,要么需要精确匹配,所以用\\转义 - 末尾的
+是量词,表示前面的字符集要匹配至少1次
合起来就是:匹配一段至少1个字符的内容,这段内容里不能包含/、,、=、@、+,用来抓取域名的主体部分(比如www.example里的www)。
第三部分:
\\.
匹配域名里的点号(比如www.example里的.)。因为.在正则里是通配符(匹配任意单个字符),所以必须用\\转义成普通的点号来精确匹配。第四部分:
[^/:;,\\\\\\(\\)]+- 同样是反向字符集搭配
+量词 - 里面的
\\/、\\:、\\;、\\,、\\\\、\\(、\\)都是转义后的特殊字符,对应禁止出现的/、:、;、,、\、(、)
合起来就是:匹配一段至少1个字符的域名后缀(比如example.com里的com),直到遇到上述禁止字符为止。
- 同样是反向字符集搭配
举个实际例子:如果URL是https://www.example.com/path?param=1,正则会匹配到//www.example.com,再经过REPLACE去掉//,最终得到www.example.com。
内容的提问来源于stack exchange,提问作者macromind
相关产品推荐
相关产品推荐

