使用 PostgreSQL,如何在出现 5 次正斜杠后用连字符替换所有正斜杠,如下所示:
https://this/is/a/very/long/url
对此:
https://this/is/a/very-long-url
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 组开始仅替换斜线,保留其余部分,则可以
可能将其减少为仅
/
。
regexp_replace()
就可以做到:
SELECT regexp_replace(url, '(?<=(.*?/){5})(.*?)/', '\1-', 'g');
url
可以是任何字符串,不一定是 URL。前 5 个之后的每个斜杠 (/
) 均替换为连字符 (-
)。
正则表达式解释:
(?<=re)
.. 正向后看(仅匹配after此表达式).*?
..'.'匹配任意字符,*?
是非贪婪量词“0-n次,尽可能少”{5}
..前一个原子的量词
\1
.. 替换中是对捕获的匹配的反向引用。
'g'
..最后一个参数“g”代表“全局”,即替换所有匹配项,而不仅仅是第一个匹配项。