修改Oracle regexp_replace反向引用表达式返回的值

时间:2014-07-03 15:49:59

标签: regex oracle plsql oracle11g

我有一个包含诸如“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次直接替换之外的任何其他选择吗?

1 个答案:

答案 0 :(得分:1)

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