postgresql - 替换文本字段中字符串的所有实例

Posted

技术标签:

【中文标题】postgresql - 替换文本字段中字符串的所有实例【英文标题】:postgresql - replace all instances of a string within text field 【发布时间】:2011-06-30 22:31:30 【问题描述】:

在 postgresql 中,如何替换数据库列中字符串的所有实例?

例如,假设我想用dog 替换所有cat 实例。

最好的方法是什么?

【问题讨论】:

如果谷歌搜索失败,请尝试使用手册:postgresql.org/docs/current/static/functions-string.html 我认为最好的解决方案在这里:***.com/a/836090/4846859 【参考方案1】:

你可以使用replace函数

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

函数定义如下(来自here):

replace(string text, from text, to text)

并返回修改后的文本。您也可以查看this sql fiddle。

【讨论】:

【参考方案2】:

你想使用postgresql的replace函数:

replace(string text, from text, to text)

例如:

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

但请注意,这将是字符串到字符串的替换,因此“类别”将变为“狗狗”。 regexp_replace 函数可以帮助您为要替换的内容定义更严格的匹配模式。

【讨论】:

大家好,我喜欢你的回答和解释,真的很有帮助。您能否添加一个使用 regexp_replace 的示例?谢谢! 为了更好的粒度,可以使用regexp_replace 对我不起作用: psql -d bercut -c 'UPDATE tasks_list SET link_to_report = replace(link_to_report ,"1.2.3.4", "1.2.3.4/reports/")' 错误:列 "1.2.3.4 " 不存在 LINE 1: ..._list SET link_to_report = replace(link_to_report,"1.2... ^ @ЕвгенийАртеменко 这可能是因为您使用双引号而不是引号。 Postgres 对此很挑剔。您需要单引号(即 '1.2.3.4' 是一个字符串,“1.2.3.4”是一个 safe 列名,可以是保留关键字的名称)。【参考方案3】:

这是一个使用正则表达式将列中 1 个或多个空白字符的所有实例替换为下划线的示例 -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

【讨论】:

我认为在“s”之前只需要一个反斜杠【参考方案4】:

正则表达式方式

如果您需要更严格的替换匹配,PostgreSQL 的regexp_replace 函数可以使用 POSIX 正则表达式模式进行匹配。它的语法是 regexp_replace(source, pattern, replacement [, flags ])

我将分别使用标志ig 进行不区分大小写和全局匹配。我还将使用\m\M 分别匹配单词的开头和结尾。

在执行正则表达式替换时通常会遇到很多问题。让我们看看用 dog 替换 cat 是多么容易。

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

即便如此,至少还有一个未解决的情况。例如,以“Cat”开头的句子将被替换为小写“dog”,这会破坏句子的大写。

查看当前的 PostgreSQL pattern matching 文档了解所有详细信息。

用替换文本更新整个列

鉴于我的例子,也许最安全的选择是:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

【讨论】:

约束^$匹配字符串的开头和结尾;但\m\M 仅匹配单词 的开头和结尾。因此,在大多数情况下,使用^$ 会失败。

以上是关于postgresql - 替换文本字段中字符串的所有实例的主要内容,如果未能解决你的问题,请参考以下文章

replace()函数用法

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

PostgreSQL 正则表达式用条件替换函数

替换数据库文本字段中所有出现的子字符串

postgresql varchar字段regexp_replace正则替换

使用 awk 或其他方法替换文件中的整个字段值