我想使用SQL正则表达式从URL中提取段
https://example.com/december-2019/content/ 这是-弹子/
我最终遇到了
SELECT
regexp_extract(url, r'\/([a-z0-9_-]*[\/]?)$') slug
FROM table
这给了我 这就是-/
但是,我只想要这就是那头子弹
我知道我可以嵌套查询并删除结尾的'/',但是我可以添加到上面的RegExp '\/([a-z0-9_-]*[\/]?)$'
上的所有东西可以一并完成吗?
此外,RegExp如何工作?我对它的运行方式有些困惑。 像这样吗
$
#从字符串末尾开始
/( )
#进行工作,找到第一个'/',并创建一个捕获组()
[ ]*
#在捕获组中创建一个字符集[],并使用*
匹配其中的所有元素
a-z0-9_-
#匹配字符集中的所有这些字符并将其拉出。
[\/]?
#与贪婪匹配有关吗?不确定这样做是什么。
任何对此的帮助都会很棒。谢谢
答案 0 :(得分:1)
以下是使用SPLIT()
函数的非正则表达式选项:
SELECT ARRAY_REVERSE(SPLIT(RTRIM(url, '/'), '/'))[SAFE_OFFSET(0)]
FROM yourTable;
此方法将删除尾随路径分隔符/
,然后在/
上拆分URL以生成一个数组。请注意,我们为此使用RTRIM
。这意味着如果没有尾随路径分隔符,URL输入将不会受到影响。该数组中的最后一个条目将保留,应该是子弹。
答案 1 :(得分:0)
在像您这样的情况下,我仍然建议使用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