问题描述
我有一些代码,我只想替换该代码中的其他内容。在我的情况下是BB到XX
AA/BB
AA/BB1
AA/BB-1
BB
BB1
BB-1
我试图用这种简单的形式来regexp_replace
查询:
select regexp_replace('AA/BB','BB','XX') from dual;
结果:
AA/XX
查询:
select regexp_replace('AA/BB-1','XX') from dual;
结果:
AA/XX-1
它可以正常工作,但可能会在斜杠AA也变为BB之前发生,但是这次不应该替换它,但仍适用于其余代码。
select regexp_replace('BB/BB','XX') from dual;
当然可以给我XX / XX,但我想达到BB / XX等。
解决方法
也许我们可以这样表述:替换'BB'
之后没有的'/'
?
regexp_replace(myval,'BB($|[^/])','XX\1')
with t as (
select 'AA/BB' myval from dual
union all select 'AA/BB1' from dual
union all select 'AA/BB-1' from dual
union all select 'BB' from dual
union all select 'BB' from dual
union all select 'BB1' from dual
union all select 'BB-1' from dual
union all select 'BB/BB' from dual
)
select myval,regexp_replace(myval,'XX\1') newval from t
MYVAL | NEWVAL :------ | :------ AA/BB | AA/XX AA/BB1 | AA/XX1 AA/BB-1 | AA/XX-1 BB | XX BB | XX BB1 | XX1 BB-1 | XX-1 BB/BB | BB/XX,
或者,请参见代码中的注释,其中“从位置开始”的含义为:如果那里有超过1个BB
子字符串,请从{{1}中的第二个BB
的位置开始}。否则,请从MYVAL
的开头开始。
@GMB,感谢您提供示例数据。
MYVAL