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')
在 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')