Postgresql regexp_replace 替换所有数字

Posted

技术标签:

【中文标题】Postgresql regexp_replace 替换所有数字【英文标题】:Postgres SQL regexp_replace replace all number 【发布时间】:2020-12-26 08:07:20 【问题描述】:

接下来我需要一些帮助。我在 SQL 中有一个字段文本,它记录了一个用“|”分隔的时间列表。例如

'14613|15474|3832|148|5236|5348|1055|524' 每个值都是以毫秒为单位的时间。该字段可以是任意长度,例如完全正确的“3215|2654”或“4565”(只有 1 个值)。我需要获取此字段并将所有数字替换为 -1000 值。

所以 '14613|15474|3832|148|5236|5348|1055|524' 将是 '-1000|-1000|-1000|-1000|-1000|-1000|-1000|-1000'

或“3215|2654”=>“-1000|-1000”或“4565”=>“-1000”。

我尝试使用 regexp_replace(times_field,'[[:digit:]]','-1000','g') 但它会替换每个数字,而不是完整的数字,所以在这个例子中:

“3215|2654”必须是“-1000|-1000”,我得到:

'-1000-1000-1000-1000|-1000-1000-1000-1000',我尝试使用其他组合和更多正则表达式选项,但我已经完成了。

需要你的帮助,谢谢!!!。

【问题讨论】:

【参考方案1】:

我们可以在这里尝试使用REGEXP_REPLACE

UPDATE yourTable
SET times_field = REGEXP_REPLACE(times_field, '\y[0-9]+\y', '-1000', 'g');

如果您真的想更改您的数据,而只是以这种方式查看您的数据,那么请使用选择:

SELECT
    times_field,
    REGEXP_REPLACE(times_field, '\y[0-9]+\y', '-1000', 'g') AS times_field_replace
FROM yourTable;

请注意,无论哪种情况,我们都会将 g 作为fourtb 参数传递给REGEXP_REPLACE,以对所有管道分隔的数字进行全局替换。

【讨论】:

【参考方案2】:

[[:digit:]] - 匹配数字 [0-9]

+ 量词 - 匹配一次到无限次,尽可能多次

你的正则表达式必须看起来像

regexp_replace(times_field,'[[:digit:]]+','-1000','g')

【讨论】:

非常感谢!!它很有效,而且很简单,我真的给你 +1 票,但我不能因为我的名誉。 “感谢反馈!声望低于 15 人的投票会被记录下来,但不要更改公开显示的帖子得分。” :(

以上是关于Postgresql regexp_replace 替换所有数字的主要内容,如果未能解决你的问题,请参考以下文章

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

Postgresql regexp_replace() 反斜杠和双引号

postgresql varchar字段regexp_replace正则替换

Postgresql regexp_replace 替换所有数字

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

列出所有外键 PostgreSQL