我有一个包含“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 次之外,您还能想到其他替代方法吗?
问题是 to_number() 对反向引用一无所知。您需要来自正则表达式函数的反向引用才能传递给 to_number(),但在正则表达式调用之外没有任何意义,所以可以说,这是先有鸡还是先有蛋。
如果您的标签不超过 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_请求数据 |
---|