Изменяет значение, возвращаемое выражением обратной ссылки Oracle regexp_replace

#regex #oracle #plsql #oracle11g

#регулярное выражение #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:

Проблема в том, что to_number () ничего не знает об обратных ссылках. Вам нужна обратная ссылка из функции регулярного выражения, чтобы перейти к to_number(), но 2 не имеет значения вне вызова регулярного выражения, так что это, так сказать, курица перед яйцом.

Комментарии:

1. Я полагал, что это будет так, просто было интересно узнать, знает ли кто-нибудь о подходящем обходном пути.

2. Вы должны быть в состоянии обойти это, просто решение может быть немного громоздким. Вы должны быть в состоянии написать инструкцию SQL, которая выполняет полную замену всех шаблонов, соответствующих регулярному выражению, заменами. Я просто сомневаюсь, что это будет замена 1-2 строк для того, что у вас есть.