使用 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 标准化地址

Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式

关于 Regexp_replace - Oracle SQL