使用 oracle regexp_replace 替换代码的某些部分
Posted
技术标签:
【中文标题】使用 oracle regexp_replace 替换代码的某些部分【英文标题】:using oracle regexp_replace to replace some part of a code 【发布时间】:2021-01-14 09:29:40 【问题描述】:我有一些代码,我只想替换该代码的一部分。在我的情况下,从 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','BB','XX') from dual;
结果:
AA/XX-1
它可以正常工作,但在斜线 AA 之前可能会是 BB,但这次它不应该被替换,但仍然适用于其余代码。
select regexp_replace('BB/BB','BB','XX') from dual;
当然给我 XX/XX,但我想达到 BB/XX 等。
【问题讨论】:
我不懂规则。您想将 BB 替换为 XX,但在某些情况下您不会。具体有哪些情况?无论如何,代码可以持续多长时间,BB 多久出现一次?您是否只想替换代码中的最后一个 BB?请澄清。 【参考方案1】:或者 - 参见代码中的 cmets,其中“从位置开始”读作:如果那里有超过 1 个 BB
子字符串,则从 MYVAL
内的第二个 BB
的位置开始。否则,从MYVAL
的开头开始。
感谢@GMB 提供示例数据。
SQL> with t as (
2 select 'AA/BB' myval from dual
3 union all select 'AA/BB1' from dual
4 union all select 'AA/BB-1' from dual
5 union all select 'BB' from dual
6 union all select 'BB' from dual
7 union all select 'BB1' from dual
8 union all select 'BB-1' from dual
9 union all select 'BB/BB' from dual
10 union all select 'AA/BB/BB-2' from dual
11 )
12 select myval,
13 regexp_replace
14 (myval, --> in MYVAL
15 'BB', --> replace BB
16 'XX', --> with XX
17 case when regexp_count(myval, 'BB') = 1 then 1 --> starting at position*
18 else instr(myval, 'BB', 1, 2)
19 end
20 ) result
21 from t;
MYVAL RESULT
---------- ---------------
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
AA/BB/BB-2 AA/BB/XX-2
9 rows selected.
SQL>
【讨论】:
【参考方案2】:也许我们可以将其表述为:替换 'BB'
后面没有 '/'
?
regexp_replace(myval, 'BB($|[^/])', 'XX\1')
Demo on DB Fiddle:
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, 'BB($|[^/])', 'XX\1') newval from t
MYVAL |纽瓦尔
:-------- | :------
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
【讨论】:
嗨,谢谢,但如果我不想修复 BB,有时是 AA/CC-1 或 BB/DD-1,换句话说,如果有 / 那么它之前的部分永远不应该被替换以上是关于使用 oracle regexp_replace 替换代码的某些部分的主要内容,如果未能解决你的问题,请参考以下文章
oracle 使用 REGEXP_REPLACE 函数替换子字符
使用 oracle regexp_replace 替换代码的某些部分
Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]
在 oracle sql 中使用 regexp_replace 标准化地址