Postgresql 中的 REGEXP_REPLACE 不是子字符串

Posted

技术标签:

【中文标题】Postgresql 中的 REGEXP_REPLACE 不是子字符串【英文标题】:REGEXP_REPLACE in Postgresql not substring 【发布时间】:2020-03-26 03:20:30 【问题描述】:

在 postgresql 中,我只想替换为完整的单词而不是子字符串。我注意到即使在子字符串中替换和翻译也会替换字符串。然后,我使用 regexp_replace 添加以下内容:

SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-z0-9])' || UPPER('CAT') || '($|[^a-z0-9])', '\1' || UPPER('GATO') || '\2','g')

在前面的示例中,CAT 不应该被替换,因为它不是一个完整的单词,而是一个单词的一部分的子字符串。我怎样才能避免更换?输出应该是 BIG CATDOG,因为不可能进行替换。

谢谢

【问题讨论】:

【参考方案1】:

发生替换是因为您只在搜索词之后检查[^a-z0-9],而D 不在该字符类中。您可以通过将A-Z 添加到您的角色类来解决此问题:

SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-zA-Z0-9])' || UPPER('CAT') || '($|[^a-zA-Z0-9])', '\1' || UPPER('GATO') || '\2','g')

或者通过在替换调用中添加i 标志:

SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-z0-9])' || UPPER('CAT') || '($|[^a-z0-9])', '\1' || UPPER('GATO') || '\2','gi')

无论哪种情况,您都将获得所需的BIG CATDOG 输出。

但是更好的解决方案是使用单词边界约束\m(单词开头)和\M(单词结尾):

SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '\m' || UPPER('CAT') || '\M', UPPER('GATO'),'g')

Demo on dbfiddle

【讨论】:

@JuanPerez 不用担心。正如您回复的那样,我进行了编辑,使用边界约束这个词可能是一个更好的解决方案。

以上是关于Postgresql 中的 REGEXP_REPLACE 不是子字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何自动关闭 PostgreSQL 中的空闲连接?

PostgreSQL:块中的无效页眉

postgresql中的范围序列

PostgreSQL 中的循环

postgresql中的关系表

PostgreSQL 中的 Query 错误没有返回结果