【问题标题】:Extract full domain from url in Google BigQuery using regex使用正则表达式从 Google BigQuery 中的 url 提取完整域
【发布时间】:2017-04-08 00:50:39
【问题描述】:

我可以请求您的帮助,以便使用 REGEXP_EXTRACT 构建一个用于 Google Big Query 的正则表达式,该表达式将解析给定输入 url 的完整域?

解析条件:

  • 开始捕获应该是:
    • 如果网址中有//:在第一次出现//之后
    • 如果没有//:从字符串的开头开始
  • 结束捕获应该是:在第一个?或第一个/或第一个&之后,如果没有找到?/&,则直到字符串的结尾李>

一些例子:

htp://www.google.com --> www.google.com
htp://www.google.com/item/ --> www.google.com
htp://www.google.com?source=google --> www.google.com
htp://www.google.com&source=google --> www.google.com
www.google.com --> www.google.com
www.google.com/item/ --> www.google.com
www.google.com?source=google --> www.google.com
www.google.com&source=google --> www.google.com
http://google.com&source=google --> google.com
https://www.example-code.com/vb/string.asp --> www.example-code.com

我创建了这个正则表达式:

REGEXP_EXTRACT('google.it?medium=cpc?cobranded=google&keywor‌​d=foo';, r'//([^/|^?|^&]+)')

但它仅适用于包含// 的网址,如果网址中没有//,我无法获得同样有效的正则表达式。

【问题讨论】:

    标签: regex google-bigquery


    【解决方案1】:

    对于使用标准 SQL 寻找解决方案的任何人,HOST() 函数现在位于 NET 命名空间下,为 NET.HOST(url)https://cloud.google.com/bigquery/docs/reference/standard-sql/net_functions#nethost

    WITH
      examples AS (
      SELECT "https://some.domain.com/path?query=param#hash" AS example
      UNION ALL
      SELECT "some.domain.com/path?query=param#hash" AS example)
    SELECT
      NET.HOST(example)
    FROM
      examples
    

    返回:

    some.domain.com
    some.domain.com
    

    【讨论】:

      【解决方案2】:

      BigQuery 提供以下三个功能:

      HOST() -- 给定一个 URL,将主机名作为字符串返回。

      DOMAIN()-- 给定一个 URL,将域作为字符串返回。

      TLD() -- 给定一个 URL,返回顶级域加上 URL 中的任何国家域。

      【讨论】:

      • BigQuery 现在改用 NET.HOST()NET.REG_DOMAIN()
      【解决方案3】:

      只是为了证明这个问题有 BigQuery 标签(而不仅仅是正则表达式) - 考虑以下选项

      BigQuery Legacy SQL 支持集URL Functions
      以下是您的案例中的使用示例

      SELECT 
        url, 
        HOST(REPLACE(CASE WHEN url CONTAINS '//' THEN url ELSE 'http://' + url END, '&', '?')) AS output
      FROM
        (SELECT 'http://www.google.com' AS url),
        (SELECT 'htp://www.google.com/item/' AS url),
        (SELECT 'htp://www.google.com?source=google' AS url),
        (SELECT 'htp://www.google.com&source=google' AS url),
        (SELECT 'www.google.com' AS url),
        (SELECT 'www.google.com/item/' AS url),
        (SELECT 'www.google.com?source=google' AS url),
        (SELECT 'www.google.com&source=google' AS url),
        (SELECT 'http://google.com&source=google' AS url)
      

      【讨论】:

      • 我更愿意学习如何创建一个正则表达式来执行此操作,但这是解决相同问题的好方法,谢谢,如果找不到正则表达式,我会使用它!跨度>
      • 明白了。为您提供快速建议 - 学习和提出开放性问题是两件不同的事情。如果你想学习——你应该先尝试一些东西——然后提出具体问题并询问如何解决或解决这个问题。这样你就有机会学习了。相反,你有点将你的学习外包给别人——所以进步的机会不大。只是觉得这条评论会帮助你改变使用SO的方式
      • 这些链接可能对您有更多帮助:How to AskMinimal, Complete, and Verifiable example 是什么
      • 嗨,米哈伊尔,你是对的,我是论坛的新手,我应该将我不工作的解决方案放在邮件正文中(我只是这样做了)。在我的主题中,我要求使用正则表达式的解决方案,我认为这就足够了!无论如何,我很高兴得到你的解决方案,如果我找不到任何正则表达式,我会使用它,谢谢!
      【解决方案4】:
      '//([^/|^?|^&]+)'
      

      以'//'开始你的正则表达式=>结果需要以'//'开始

      你可以这样做

      '(?://)([^/|^?|^&]+)'
      

      使用 '()' 我创建了一个匹配组,但使用 ?:该匹配组不会出现在结果中

      【讨论】:

      • 感谢您的反馈和解释,但通过这样做,它确实适用于没有像 www.google.com 这样的“//”的网址,但它不再适用于像 google.com 这样的网址,因为它捕获“http:”
      【解决方案5】:

      可能类似于

      (w{0,3}\.*[a-z]+\.[a-z]*)
      

      Explanation

      应该匹配任何带或不带 www 的 url

      【讨论】:

      • 感谢您的帮助!恐怕我在示例中不够清楚(我只是编辑了消息),因为它也应该适用于任何其他域,例如不以 www 开头的域。例如,在“google.com&source=google”的情况下,它应该提供“google.com”
      • 甚至w{0,3}\.{0,1}
      • 您好,感谢您的反馈!在我看来,我可以删除第一部分,不是吗?我的意思是,只使用: ([az]+\.[az]*) 我看到的唯一问题是它不适用于包含“-”(这是一个允许的字符)的域,例如 example-code.com/vb/string.asp 我应该像这样修改: ([az|-]+\.[az|-]*) ?谢谢!
      • @Jonk 你可以用(w{0,3}\.{0,1}[a-z-]+\.[a-z-]*)
      【解决方案6】:

      这行得通吗?

      /b[\w.-]+(?:com|edu)
      

      仅适用于“.com”和“edu”地址,但也许可以进一步修改。

      ****更新****

      忍不住玩了起来。以下是将域分组为捕获组的方法:

      ([\w.-]++(?!:)).*+
      

      需要支持前瞻,并且假定每个 url 之间有换行符。

      基本上,它会找到任何一系列不带冒号的字母、数字、句点或破折号。

      冒号是为了防止它找到http:

      '.*+' 将消耗该行的其余部分,因此它不会在第一次分组后继续查找匹配项。

      【讨论】:

        猜你喜欢
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        相关资源
        最近更新 更多