【问题标题】:using oracle regexp_replace to replace some part of a code使用 oracle regexp_replace 替换代码的某些部分
【发布时间】: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?请澄清。

标签: sql regex string oracle regexp-replace


【解决方案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,换句话说,如果有 / 那么它之前的部分永远不应该被替换
    猜你喜欢
    • 2018-08-14
    • 2020-01-27
    • 2020-01-14
    • 2014-11-17
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多