提取没有子域的域,除了www和RE2/regex?
此正则表达式从URL中提取具有TLD的域:提取没有子域的域,除了www和RE2/regex?,regex,google-data-studio,re2,Regex,Google Data Studio,Re2,此正则表达式从URL中提取具有TLD的域: TRIM(REGEXP\u EXTRACT(REGEXP\u REPLACE)(REGEXP\u REPLACE(Address,“https?:/”,“”),R“^(w{3}\)?,”,”,([^/?]+))) 此表达式由http://www.example.com/page.html→ example.com,这是预期的输出 但它仅在子域为www的情况下有效。在其他情况下,它不会处理 如果我改为使用TRIM(REGEXP\u EXTRACT(REG
TRIM(REGEXP\u EXTRACT(REGEXP\u REPLACE)(REGEXP\u REPLACE(Address,“https?:/”,“”),R“^(w{3}\)?,”,”,([^/?]+)))
此表达式由http://www.example.com/page.html
→ example.com
,这是预期的输出
但它仅在子域为www
的情况下有效。在其他情况下,它不会处理
如果我改为使用TRIM(REGEXP\u EXTRACT(REGEXP\u REPLACE)(REGEXP\u REPLACE(Address,“https?:/”),R“^([a-zA-Z0-9]{1,}\),”),([^/?]+))
-整个域名消失,只剩下TLD
有没有办法处理任何子域,哪个字符串可以用[a-zA-Z0-9]{1,}
表示
预期产出为
+-------------------+-------------+
| sites.example.com | example.com |
+-------------------+-------------+
| m.example.com | example.com |
+-------------------+-------------+
| ww2.example.com | example.com |
+-------------------+-------------+
| mail.example.com | example.com |
+-------------------+-------------+
| blog.example.com | example.com |
+-------------------+-------------+
| shop.example.com | example.com |
+-------------------+-------------+
| cdn.example.com | example.com |
+-------------------+-------------+
| api.example.com | example.com |
+-------------------+-------------+
| 1.example.com | example.com |
+-------------------+-------------+
保留代码以摆脱协议和路径,让我们只剩下域,我建议使用一个正则表达式来捕获子域、域和TLD。然后我们可以用域和TLD替换匹配 请注意,URL可能包含ftp协议或带有用户和可选密码的身份验证部分,或者该协议也可能是通用的。当然,这取决于你的数据 示例:
ftp://something.example.com/folder
http://user:pswd@subdomain.example.com/path
//xyz-123.sub-domain.example.com
我玩过Regex101:
正则表达式是:
^((?:\w[\w-]{0,61}\)*)(\w[\w-]{0,61}\[a-z]{2,62})$
解释:
用于捕获零件。在这里,我们捕获了捕获编号1中的子域,即捕获编号2中具有TLD的域()
是非捕获组。这里它用于子域模式,因为它始终是一个带有最终连字符的单词,后跟一个点、零或几次。所以(?:)
表示一个单词字符(a-z+a-z+0-9),然后是一个单词字符或连字符,0到61次。这是因为最大长度似乎是62个字符。然后是一个点\w[\w-]{0,61}\.
- 我们希望重复这种模式,因为我们可以有多个子域。这就是为什么将此表达式放在非捕获组中,该组可以是0或n倍:
(?:\w[\w-]{0,61}\)*
- 我们将捕获此子域,以便以后使用括号:
((?:\w[\w-]{0,61}\)*)
- 现在,第二个有趣的组是我们的域和TLD:
(\w[\w-]{0,61}\[a-z]{2,62})
- 域是
,因为它不能以连字符开头\w[\w-]{0,61}
- TLD是
\.[a-z]{2,62}
- 域是
我不知道RE2 regex replace方法的确切语法,因此替换字符串可以是
“$2”
或“\2”
”,如果字段是地址
,下面的方法可以实现:
REGEXP_EXTRACT(
REGEXP_EXTRACT(
REGEXP_REPLACE(Address, "^(.*//)", ""),
"^([^/]*)"),
R"([^\.]*\.[^\.]*)$")
第3行到第5行的快速细分,使用以下未列出的解释:
- 第3行
:删除REGEXP\u REPLACE(地址“^(.*/)”,”)
或http/
部分https/
- 第4行:
:提取所有字符,直到第一个REGEXP\u EXTRACT(第3行,“^([^/]*)”
/
- 第5行:
:从字符串末尾提取所有字符,直到第二个REGEXP\u EXTRACT(第4行,R“([^\.]*\.[^\.]*.])$”
re2
就是这样。我在GoogleDataStudio中以计算字段的形式运行它,其中re2是正则表达式的首选。