使用PostgreSQL,如何在出现5次正斜杠后将所有正斜杠替换为连字符,如下所示:

https://this/is/a/very/long/url

对此:

https://this/is/a/very-long-url

推荐答案

一个带有智能图案的regexp_replace()可以做到这一点:

SELECT regexp_replace(url, '(?<=(.*?/){5})(.*?)/', '\1-', 'g');

fiddle

url可以是任何字符串,不一定是URL.第一个5之后的每个斜杠(/)都替换为连字符(-).

正则表达式解释说:

(?<=re)...positive lookbehind(仅与此表达式匹配after)

.*?....匹配任何字符,*?是非贪婪量词"0-n次,尽可能少"

{5}..前一个原子的量词

\1……在替补中是back reference分才能捕捉到比赛.

'g'...最后一个参数‘g’代表"全局",即替换所有匹配项,而不仅仅是第一个匹配项.

Sql相关问答推荐

如何根据SQL中的列条件获取下一个时间戳?

SQL计数所有值在联接范围内的行

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

将重复的值更新为下一个空闲数字

如何实现同一列的递归计算?

数组列的postgres更新查询

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

在WHERE EXISTS子查询中,列返回是否重要?

如何在多列上编写具有不同条件的查询?

将伪数据插入Postgres表

在同一列上迭代时计算持续时间

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

SQL Select 字母范围没有给我任何东西

使用 SQL 计算一年中任意 3 个月期间的总成本

按公司和产品查询最近发票的平均价格的SQL查询

所有列分组的简写?

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

忽略与给定列匹配的行的 LAG 函数

具有日期时间条件的存储过程

条件意外地显着降低性能的地方