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

postgres regex_replace everything between the third and last forward slash

我在 Postgres table 中有一些 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    | 

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

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

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

live demo

正则表达式 (?<!/)/[^/]+(?=/) 的工作方式如下:

  • /[^/]+ 匹配斜杠后跟 non-slashes
  • (?<!/) 前面的字符不是斜杠。这可以防止匹配 // 之后的部分,而您希望保留
  • (?=/) 要求后面的字符是斜杠。这会阻止匹配您要保留的最终术语

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