【问题标题】:postgres regex_replace everything between the third and last forward slashpostgres regex_replace 第三个和最后一个正斜杠之间的所有内容
【发布时间】: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    | 

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

【问题讨论】:

    标签: regex postgresql regexp-replace


    【解决方案1】:

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

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

    见live demo。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2018-03-11
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2023-03-11
      相关资源
      最近更新 更多