SQL RegExp 从 URL 中提取数据域



我想使用 SQL 正则表达式从 URL 中提取 slug

https://example.com/december-2019/content/这是蛞蝓/

我最终遇到了这个

SELECT
regexp_extract(url, r'/([a-z0-9_-]*[/]?)$') slug
FROM table

这给了我这就是蛞蝓/

但是,我只想要这个是鼻涕虫

我知道我可以嵌套我的查询并删除结尾"/",但是我可以添加到上面的 RegExp'/([a-z0-9_-]*[/]?)$'中,可以同时完成所有操作吗?

另外,正则表达式是如何工作的?我对它的运作方式有点困惑。 是这样的吗

$# 从字符串末尾开始
/( )# 返回并找到第一个"/"并创建一个捕获组 ((
[ ]*# 在捕获组中创建一个字符集 [] 并使用 *
a-z0-9_-# 匹配字符集中的所有这些字符并将它们拉出。
[/]?#与贪婪匹配有关?不知道这是做什么的。

对此的任何帮助都会很棒。谢谢

下面是一个使用SPLIT()函数的非正则表达式选项:

SELECT ARRAY_REVERSE(SPLIT(RTRIM(url, '/'), '/'))[SAFE_OFFSET(0)]
FROM yourTable;

此方法删除尾随路径分隔符/,然后在/上拆分 URL 以生成数组。 请注意,我们为此目的使用RTRIM。 这意味着,如果 URL 输入没有尾随路径分隔符,则不会受到影响。 保留该数组中的最后一个条目,该条目应该是 slug。

我仍然建议在像您这样的情况下使用 REGEXP - 您的正则表达式非常接近它应该的样子 - 您只需/?移动到捕获的组之外,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
SELECT 'https://example.com/december-2019/content/this-is-the-slug1/' url UNION ALL
SELECT 'https://example.com/december-2019/content/this-is-the-slug2' 
)
SELECT 
REGEXP_EXTRACT(url, r'/([a-z0-9_-]*?)/?$') slug
FROM `project.dataset.table`  

有结果

Row slug     
1   this-is-the-slug1    
2   this-is-the-slug2    

最新更新