SQL RegExp从URL中提取该段

时间:2019-12-18 15:53:58

标签: sql regex google-bigquery

我想使用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_-#匹配字符集中的所有这些字符并将其拉出。
[\/]?#与贪婪匹配有关吗?不确定这样做是什么。

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

2 个答案:

答案 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