我想使用 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