REGEXP_REPLACE 在 Postgresql 中不是子字符串

REGEXP_REPLACE in Postgresql not substring

在 postgresql 中,我只想用完整的单词而不是子字符串来代替。我注意到 replace 和 translate 甚至可以在子字符串中替换字符串。然后,我使用 regexp_replace 添加以下内容:

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

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

谢谢

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

来解决此问题
SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-zA-Z0-9])' || UPPER('CAT') || '($|[^a-zA-Z0-9])', '' || UPPER('GATO') || '','g')

或者通过将 i 标志添加到替换调用:

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

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

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

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

Demo on dbfiddle