【问题标题】:How do I get the 3 last values between dashes in the last part of an URL如何获取 URL 最后一部分中破折号之间的最后 3 个值
【发布时间】:2020-07-23 15:47:51
【问题描述】:

我有一个网址:

https://www.example.com/one/two/three/four/five/six/seven/x2-small-2

我想在 Google Bigquery 中使用 3 个正则表达式提取 URL 的最后一部分以作为返回

  • x2
  • 2

这个正则表达式

REGEXP_EXTRACT(JSON_EXTRACT( A.resource_data,"$.Type" ), '"(.*)"') AS model,

给予

https://www.example.com/one/two/three/four/five/six/seven/x2-small-2

据我所知,在 Bigquery 中它是 REGEX Re2

感谢您的帮助!抱歉,我是正则表达式的新手

这个正则表达式

REGEXP_EXTRACT(JSON_EXTRACT( A.resource_data,"$.Type" ), '".*/(.*)"') AS model,

给予

x2-small-2

我至少想提取最后一个数字 (2)。有什么想法吗?

【问题讨论】:

  • 这是 PCRE,而不是 Perl。那是一个正则表达式引擎。与 Perl 编程语言无关(除了与 Perl 的正则表达式兼容)。
  • 感谢提供信息
  • BigQuery 正则表达式引擎是 RE2。离PCRE真的很远。
  • 我不需要完整的查询,只需将 3 行正则表达式集成到我的查询中。感谢您的反馈!

标签: sql regex google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT url,
  parts[SAFE_OFFSET(0)] part1,
  parts[SAFE_OFFSET(1)] part2,
  parts[SAFE_OFFSET(2)] part3
FROM (
  SELECT url, SPLIT(ARRAY_REVERSE(SPLIT(url, '/'))[OFFSET(0)], '-') parts
  FROM `project.dataset.table`
)   

如果应用到您的问题中的样本数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'https://www.example.com/one/two/three/four/five/six/seven/x2-small-2' url
)
SELECT url,
  parts[SAFE_OFFSET(0)] part1,
  parts[SAFE_OFFSET(1)] part2,
  parts[SAFE_OFFSET(2)] part3
FROM (
  SELECT url, SPLIT(ARRAY_REVERSE(SPLIT(url, '/'))[OFFSET(0)], '-') parts
  FROM `project.dataset.table`
)    

输出是

Row url                                                                     part1   part2   part3    
1   https://www.example.com/one/two/three/four/five/six/seven/x2-small-2    x2      small   2   

【讨论】:

    【解决方案2】:

    要获取最后一个元素,请使用此模式。 (对于倾斜牙签综合症,我不知道您使用的技术中正确的模式构建语法是什么)。

    /\/([^\/]+)$/
    

    您将获得一个包含整个最后路径部分的捕获组。见regex101

    然后您可以将其分解成更小的部分。如果三个字段的格式始终相同,您也可以为此编写模式。

    /\/([^\/]+)-(.+)-(.+)$/
    

    这将为您提供三个捕获组。见regex101

    【讨论】:

    • 第一个消息:语法错误:非法转义序列:\/ at [8:25] 第二个,在运行查询时得到这个消息:传递给提取函数的正则表达式必须没有超过 1 个捕获组。还是谢谢你
    猜你喜欢
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2013-06-14
    • 2011-11-15
    • 2013-11-01
    • 2019-04-30
    相关资源
    最近更新 更多