出现 5 次后,将所有正斜杠替换为连字符

问题描述 投票:0回答:2

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

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

对此:

https://this/is/a/very-long-url
sql regex postgresql pattern-matching
2个回答
1
投票

您可以将

regexp_replace()
regexp_instr()
结合使用。后者告诉你第 6 个正斜杠
/
在哪里,前者从该位置开始并继续替换直到字符串末尾:demo

select regexp_replace('https://this/is/a/very/long/url',
                      '/',
                      '-',
                      regexp_instr('https://this/is/a/very/long/url',
                                   '/',1,6),
                      0);
正则表达式_替换
https://this/is/a/very-long-url

如果您更改模式以包含后面跟有 regexp_replace() 的任何内容组,并告诉它从第 6 组开始仅替换斜线,保留其余部分,则可以

可能
将其减少为仅
/


0
投票

一个带有智能图案的

regexp_replace()
就可以做到:

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

小提琴

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

正则表达式解释:

(?<=re)
.. 正向后看(仅匹配after此表达式)
.*?
..'.'匹配任意字符,
*?
是非贪婪量词“0-n次,尽可能少”
{5}
..前一个原子的量词

\1
.. 替换中是对捕获的匹配的反向引用。

'g'

 ..最后一个参数“g”代表“全局”,即替换所有匹配项,而不仅仅是第一个匹配项。

© www.soinside.com 2019 - 2024. All rights reserved.