2017-05-11 9 views
-1

BeispielMusterabgleich und ersetzen mit REGEXP_REPLACE

Eingabestring: OUT for GLE gle gle. single mingle ringle asdfgle gleret GLE

die folgenden udpate Anweisung ausführen

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

Current Ersatz: OUT for XXXXX XXXXX gle. sin XXXXX min XXXXX rin XXXXX asdf XXXXX XXXXX ret XXXXX

Erwartete Leistung: OUT for XXXXX XXXXX XXXXX. single mingle ringle asdfgle gleret XXXXX

Problem: Es ist die gle von den normalen Wörter ersetzen (wie: single mingle ringle), ich möchte nicht das Muster ersetzt werden, wenn sein Teil des Wortes

Antwort

1

Sie müssen die Vorkommen von ‚gle‘ finden, die vorangehen und gefolgt von einem Nicht-Wort-Zeichen und/oder dem Anfang oder Ende der Zeichenfolge.

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 

Werfen Sie einen genauen Blick auf die Ausgabe aber: es ist immer noch ein gle drin. Dies liegt daran, dass der davor liegende Raum auch der Raum ist, der dem ersten GLE in der Zeichenfolge folgt. Dieser Speicherplatz wird bereits in der ersten Übereinstimmung verwendet. Daher kann er nicht erneut verwendet werden, um eine zweite Übereinstimmung zu finden.

Die einzige Lösung, die ich kenne, um mit dieser Art von Situation umzugehen, besteht darin, die gleiche Funktion ein zweites Mal aufzurufen, nach dem Ergebnis des ersten Anrufs.

select regexp_replace(regexp_replace str, ...., ...., ), ...., ....) .... 
Verwandte Themen