postgres regex_replace 第三个和最后一个正斜杠之间的所有内容

Posted

技术标签:

【中文标题】postgres regex_replace 第三个和最后一个正斜杠之间的所有内容【英文标题】:postgres regex_replace everything between the third and last forward slash 【发布时间】:2020-12-11 19:21:06 【问题描述】:

我在 Postgres 表中有一些 URL,目前看起来像这样:

http://blue.website.com/categoryA/sectionA/title/6534566234
http://yellow.website.com/categoryA/sectionB/title/36476586
http://green.website.com/categoryB/sectionB/title/34646634

我正在尝试创建一个可用于将 URL 转换为如下所示的正则表达式:

http://blue.website.com/6534566234
http://yellow.website.com/36476586
http://green.website.com/34646634

我能够弄清楚如何使用 regex_replace 将直到最后一个 / 的所有内容都替换为空:

select regexp_replace('http://blue.website.com/categoryA/sectionA/title/6534566234', '^.*/', '')

regexp_replace|
--------------|
6534566234    | 

但是,我不确定如何扩展它以替换第三个 / 和最后一个 / 之间的所有内容。

【问题讨论】:

【参考方案1】:

将每个术语分别替换为空白(即“删除”),使用环视来定位正确的部分:

select regexp_replace('http://blue.website.com/categoryA/sectionA/title/6534566234', '(?<!/)/[^/]+(?=/)', '', 'g')

见live demo。

正则表达式(?&lt;!/)/[^/]+(?=/) 的工作原理如下:

/[^/]+ 匹配斜线后跟非斜线 (?&lt;!/) 前面的字符不是斜杠。这可以防止匹配您想要保留的// 之后的部分 (?=/) 要求以下字符为斜线。这会阻止匹配您要保留的最终术语

最后一个参数 'g'global 标志 - 表示替换 all 匹配项(不仅仅是第一个,如果未指定此参数,则会出现这种情况)

【讨论】:

以上是关于postgres regex_replace 第三个和最后一个正斜杠之间的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

我只想将 regex_replace 用于第一个字符(电话号码)

如何在 regex_replace() 中使用 db 列名 - presto

Oracle regex_replace 不排除某些值

尝试使用 regex_replace 提取数字

解码为希伯来语时不正确的 regex_replace

Oracle:是不是有支持内联代码的 REGEX_REPLACE 变体?