【问题标题】:Modify value returned by Oracle regexp_replace backreference expression修改 Oracle regexp_replace 反向引用表达式返回的值
【发布时间】:2014-08-24 20:17:53
【问题描述】:

我有一个包含诸如“String1...String2...”等值的字符串。我正在尝试使用 Oracle 内置的 regexp_replace 将这些值替换为“StringA...StringB”等。我已经完成了正则表达式模式来查找字符串,并且可以分别引用模式的两个部分,如替换字符串争论中的 \1-----\2 所示:

with d as (select '<PatFactors><String1>0</String1><String2>0</String2><String3>0</String3><String4>0</String4><String5>0</String5><String6>0</String6><String7>0</String7><String8>0</String8><String9>0</String9><String10>0</String10><String11>0</String11><String12>0</String12><String13>0</String13><String14>0</String14><String15>0</String15><String16>0</String16><String17>0</String17><String18>0</String18><String19>0</String19><String20>0</String20><String21>0</String21><String22>0</String22><String23>0</String23><String24>0</String24><String25>0</String25><String26>0</String26><String27>0</String27><String28>0</String28><String29>0</String29><String30>0</String30></PatFactors>' as o_requestdata
             from dual)   
select regexp_replace(o_requestdata, '([Ss]tring)([0-9]+)', '\1-----\2'/*||chr(ascii('A')-1+to_number('\2'))*/ ) from d;

我想要做的是保留反向引用 \1,然后将 \2 传递给一个表达式,就像被注释掉的那个。不幸的是,如果我取消对此部分的注释,则会出现无效数字错误。

有谁知道是否可以像这样对反向引用执行操作,或者除了对每个值进行 30 次直接替换之外,您还能想到其他替代方法吗?

【问题讨论】:

    标签: regex oracle plsql oracle11g


    【解决方案1】:

    问题是 to_number() 对反向引用一无所知。您需要正则表达式函数的反向引用才能传递给 to_number() 但 \2 在正则表达式调用之外没有任何意义,因此可以说是先有鸡。

    【讨论】:

    • 我想会是这样,只是想看看是否有人知道合适的解决方法。
    • 您应该能够解决它,只是解决方案可能有点笨拙。您应该能够编写一个 SQL 语句,用替换完全替换与正则表达式匹配的所有模式。我只是怀疑它会替代你所拥有的 1-2 班轮。
    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 2014-10-07
    • 2011-01-18
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多