如何用regexp_replace替换字符串从后往前的首个匹配项
解决替换字符串最后一个匹配项的问题
直接使用带负向预查的正则表达式,就能精准定位并替换最后一个text,且不影响其他匹配项:
select regexp_replace('dont replace this text, but instead replace the last text <-- this one', '\btext\b(?!.*\btext\b)', 'ONE');
原理说明
\btext\b:匹配独立的text单词(避免误匹配包含text的其他字符串)(?!.*\btext\b):负向预查规则,确保当前匹配的text后面不会再出现另一个text,以此锁定字符串中最后一个目标单词
之前的错误分析
- 第一条语句
regexp_replace(..., "\\b(text)\\b", "ONE"):无匹配范围限制,会替换所有符合\btext\b的实例,导致两个text都被替换。 - 第二条语句
regexp_replace(..., "\\b.*(text)\\b", "ONE"):.*是贪婪匹配,会从字符串开头一直匹配到最后一个text的位置,整个匹配范围覆盖了开头到最后一个text的全部内容,替换后这部分直接变成ONE,所以前面的文本全部丢失。
内容的提问来源于stack exchange,提问作者jeffreyp
相关产品推荐
相关产品推荐

