如何使用REGEXP_REPLACE按指定条件替换重复出现的单词
错误点说明
!~*是PostgreSQL的正则匹配操作符,仅用于WHERE条件做匹配判断,不能作为regexp_replace函数的匹配模式参数- 原有正则没有区分需要保留的第一个
test和需要替换的后续test,逻辑完全不匹配需求 - 拼写错误:目标替换值
successful少写了字母s,写成了succesful
正确实现代码
如果使用PostgreSQL 9.6及以上版本,支持可变长度正向环视,可以直接用极简写法:
SELECT regexp_replace(''') test test test', '(?<=\) test.*)\mtest\M', 'successful', 'g');
如果是更低版本的PostgreSQL,用嵌套写法兼容所有版本:
SELECT regexp_replace( ''') test test test', '(\) test)(.*)', '\1' || regexp_replace('\2', '\mtest\M', 'successful', 'g'), 'gi' );
逻辑说明
- 极简写法通过正向环视规则,匹配所有前面已经出现过
) test的独立test单词,直接批量替换为successful - 兼容版本先将字符串拆为两部分:开头固定要保留的
) test(捕获组1)、第一个test之后的所有剩余内容(捕获组2),再单独把捕获组2里所有test替换为successful,最后拼接两部分内容得到结果
两种写法输入') test test test都会输出目标结果') test successful successful,后续不管有多少个test都会被正确替换。
内容的提问来源于stack exchange,提问作者SamuelFernandes
相关产品推荐
相关产品推荐

