模式匹配并用regexp_replace替换

时间:2017-05-11 12:50:44

标签: sql oracle

示例

输入字符串:OUT for GLE gle gle. single mingle ringle asdfgle gleret GLE

执行以下udpate语句

update TICKET
set desription_Modified = regexp_replace(desription_Modified, ' GLE | GLE|GLE ', ' XXXXX ',1,0,'i' )
where issue_key='ad';

当前替换:OUT for XXXXX XXXXX gle. sin XXXXX min XXXXX rin XXXXX asdf XXXXX XXXXX ret XXXXX

预期输出:OUT for XXXXX XXXXX XXXXX. single mingle ringle asdfgle gleret XXXXX

问题:它将gle替换为普通单词(例如:single mingle ringle),我不希望在单词的一部分中替换该模式

1 个答案:

答案 0 :(得分:1)

您需要找到“gle”的出现位置,前面跟着非单词字符和/或字符串的开头或结尾。

with
     inputs ( str ) as (
       select 'OUT for GLE gle gle. single mingle ringle asdfgle  gleret GLE' from dual
     )
select regexp_replace(str, '(\W|^)gle(\W|$)', '\1XXXXX\2', 1, 0, 'i') as new_str
from   inputs
;


NEW_STR
-------------------------------------------------------------------
OUT for XXXXX gle XXXXX. single mingle ringle asdfgle  gleret XXXXX

仔细查看输出结果:其中仍然存在 gle 。这是因为它前面的空格也是字符串中第一个GLE之后的空格;该空间已在第一场比赛中使用,因此无法重复使用以查找第二场比赛。

我知道的唯一解决这种情况的方法是在第一次调用的结果中再次调用相同的函数。

select regexp_replace(regexp_replace str, ...., ....,   ), ...., ....)  ....