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

问题描述 投票:0回答:2

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

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;

我想做的是保留反向引用,然后传递到像注释掉的表达式一样的表达式中。不幸的是,如果我取消注释此部分,则会出现无效数字错误。

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

regex oracle-database plsql oracle11g
2个回答
1
投票

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


0
投票

如果您的标签不超过 26 个,您应该能够在 XML 查询中使用 FLWOR 表达式来修改标签名称:

UPDATE d
SET o_requestdata = XMLSERIALIZE(
              CONTENT XMLQUERY(
                'copy $e := .
                 modify (
                   for $a in $e/*/*[matches(name(), "^(string)([0-9]+)$", "i")]
                     return rename node $a as concat(
                         replace(name($a), "[0-9]+$", ""),
                         codepoints-to-string(
                           64 + xs:integer(replace(name($a), "^string", "", "i"))
                         )
                       )
                 )
                 return $e'
                PASSING XMLTYPE(o_requestdata)
                RETURNING CONTENT
              )
              AS CLOB  
            );

对于样本数据:

CREATE TABLE d (o_requestdata) AS
SELECT EMPTY_CLOB() || '<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></PatFactors>'
FROM   DUAL;

将表格更新为:

O_请求数据
0000000000000 0000000000000

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.