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 不是子字符串的主要内容,如果未能解决你的问题,请参考以下文章