使用 postgres regexp_replace() 替换字符串中的整数

Posted

技术标签:

【中文标题】使用 postgres regexp_replace() 替换字符串中的整数【英文标题】:Use postgres regexp_replace() to replace integers in a string 【发布时间】:2019-09-16 16:38:05 【问题描述】:

我有一个需要查询的 redshift 数据库,并且需要将相似的字符串组合在一起。我正在使用 regexp_replace() 来执行此操作,但无法弄清楚如何将中间有整数的字符串分组。例如:

数据集:

string
'aaa/123/bbb'
'aaa/456/bbb'
'ccc/123/ddd'

我需要将其分组以便我们得到

string     count(*)
aaa/id/bbb 2
ccc/id/ddd 1

所以我尝试过使用

regexp_replace(endpoint, '/[0-9]+$/', '/id/')

但它不起作用,我假设是因为没有通配符之类的?但我不知道如何解决这个问题。

提前致谢

【问题讨论】:

【参考方案1】:

我知道您还想替换最后的数字。这接近你想要的:

select regexp_replace(endpoint, '/[0-9]+(/|$)', '/id/')
from (select 'aaa/123/bbb' as endpoint union all
      select 'aaa/123' as endpoint 
      ) x

但在第二种情况下,它会在末尾返回一个斜杠。

如果你没有其他以数字开头的中间值,那么这就是你想要的:

select regexp_replace(endpoint, '/[0-9]+', '/id')
from (select 'aaa/123/bbb' as endpoint union all
      select 'aaa/123' as endpoint 
      ) x

否则,两次调用 regexp_replace() 就可以解决问题:

select regexp_replace(regexp_replace(endpoint, '/[0-9]+/', '/id/'), '/[0-9]$', '/id')
from (select 'aaa/123/bbb' as endpoint union all
      select 'aaa/123' as endpoint 
      ) x;

【讨论】:

以上是关于使用 postgres regexp_replace() 替换字符串中的整数的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 中匹配 regexp_replace 中的 2 个条件

Postgres regexp_replace:无法用第一个捕获的组替换源文本

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

从 postgres 表列中删除括号,但在其中保留单词

需要使用 regexp_replace (Postgresql) 将逗号添加到数字列表中

使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对