查找具有不同结尾的子串

Finding Substring with Different Ending

我正在尝试查找 URL 列表的子字符串,但由于其中一个 URL 末尾的额外字符(正斜杠)而遇到问题。以下是两个数据示例:

我想获取 URL 的最后一个字符串——在本例中为 testtest2。但是,我当前的 REGEX_SUBSTR 只给我第一个 URL 的子字符串,第二个 URL 的子字符串为空,因为第二个 URL 有一个正斜杠。

如何创建查询,使其 returns 同时 testtest2

我的 REGEXP_SUBSTR 查询示例:

REGEXP_SUBSTR(URL, '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT

您可以为此任务使用 Positive Lookahead:

[^\/\n]+(?=\/?$)

解释:

  • [^\/\n]+: 除斜杠和换行符之外的任意字符组合(您的匹配项)
  • (?=\/?$):正面前瞻(检查你的比赛之后是否有)
    • \/?: 可选斜杠
    • $: 结束字符串

试试看 here.

使用PARSE_URL

Returns a JSON object consisting of all the components (fragment, host, path, port, query, scheme) in a valid input URL/URI.

WITH cte AS (
  SELECT CONCAT('http://', COLUMN1) AS URL
  FROM VALUES   ('www.url1.com/test'), 
                ('www.url1.com/test2/'), 
                ('www.url1.com/test/sub_test/')
)
SELECT URL, 
       PARSE_URL(URL) AS parts,
       PARSE_URL(URL):path::text AS path,
       TRIM(PARSE_URL(URL):path::text, '/') AS path
FROM cte;

输出:


编辑:

How would you get just "sub_test" for the last example you have there?

SPLIT_PART 可以使用负索引:

WITH cte AS (
  SELECT CONCAT('http://', COLUMN1) AS URL
  FROM VALUES   ('www.url1.com/test'),
                ('www.url1.com/test2/'), 
                ('www.url1.com/test/sub_test/')
)
SELECT URL, 
       PARSE_URL(URL) AS parts,
       PARSE_URL(URL):path::text AS path,
       SPLIT_PART(TRIM(PARSE_URL(URL):path::text, '/'), '/', -1) AS path3
FROM cte;

输出:

你可以像这样 trim 关闭最后一个斜杠:

select REGEXP_SUBSTR(trim(URL, '/'), '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT

如 Lukasz 所示,将 URL 解析为 JSON 将涵盖更多可能性,但如果这是唯一需要纠正的问题,这对于大型数据集会更快。