Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取没有子域的域,除了www和RE2/regex?_Regex_Google Data Studio_Re2 - Fatal编程技术网

提取没有子域的域,除了www和RE2/regex?

提取没有子域的域,除了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

此正则表达式从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(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的域
  • (?:)
    是非捕获组。这里它用于子域模式,因为它始终是一个带有最终连字符的单词,后跟一个点、零或几次。所以
    \w[\w-]{0,61}\.
    表示一个单词字符(a-z+a-z+0-9),然后是一个单词字符或连字符,0到61次。这是因为最大长度似乎是62个字符。然后是一个点
  • 我们希望重复这种模式,因为我们可以有多个子域。这就是为什么将此表达式放在非捕获组中,该组可以是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}
最后,您只需要将匹配的完整域替换为匹配的组号2,其中包含您的域和TLD。
我不知道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“([^\.]*\.[^\.]*.])$”
    :从字符串末尾提取所有字符,直到第二个
(嵌入式数据源)和GIF来详细说明:

re2
就是这样。我在GoogleDataStudio中以计算字段的形式运行它,其中re2是正则表达式的首选。