Относительно Oracle Regexp_Replace

У меня есть строка типа «Винот ^ Винот Картик Винот ^ Винот ^ Винот», разделенная знаком «^». Я хотел бы заменить только Vinoth на XXX.

I/P String : Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth
Expected output : XXX^Vinoth Karthick Vinoth^XXX^XXX

Пожалуйста, предложите, как это сделать, используя Regexp_replace или любую другую функцию в заявлении ORACLE SQL.


person Vinoth Karthick    schedule 26.04.2018    source источник
comment
вы должны иметь возможность заменить строку, включая разделитель, новой строкой, также включая разделитель, с помощью REPLACE. вы также можете почувствовать необходимость использовать опцию замены REGEX, если ваш шаблон более сложный.   -  person Randy    schedule 26.04.2018
comment
Какой из них вы хотите изменить ^Vinoth или Vinothкак строку шаблона? Поскольку, я думаю, ожидаемый результат должен быть XXX^Vinoth Karthick XXX^Vinoth^Vinoth или VinothXXX Karthick VinothXXXXXX...   -  person Barbaros Özhan    schedule 26.04.2018
comment
Строка I/P: Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth Ожидаемый результат: XXX^Vinoth Karthick Vinoth^XXX^XXX   -  person Vinoth Karthick    schedule 26.04.2018


Ответы (2)


Удвойте символы разделителя ^ и оберните строку символами разделителя ^, чтобы каждый элемент имел свой собственный начальный и конечный разделитель, тогда вы можете просто заменить ^Vinoth^ на ^XXX^ и отменить удвоение разделителей и обрезать начальный и конечный разделители:

скрипт SQL

Настройка схемы Oracle 11g R2:

SELECT 1 FROM DUAL;

Запрос 1:

SELECT TRIM(
         '^' FROM
         REPLACE(
           REPLACE(
             '^' ||
             REPLACE(
               'Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth',
               '^',
               '^^'
             )
             || '^',
             '^Vinoth^',
             '^XXX^'
           ),
           '^^',
           '^'
         )
       ) AS replaced
FROM   DUAL

Результаты:

|                           REPLACED |
|------------------------------------|
| XXX^Vinoth Karthick Vinoth^XXX^XXX |
person MT0    schedule 26.04.2018

Еще вариант:

SQL> with test (col) as
  2    (select 'Vinoth^Vinoth Karthick Vinoth^Vinoth^Vinoth' from dual),
  3  inter as
  4    (select regexp_substr(replace(col, '^', ':'), '[^:]+', 1, level) col,
  5            level lvl
  6     from test
  7     connect by level <= regexp_count(col, '\^') + 1
  8    )
  9  select listagg(regexp_replace(col, '^Vinoth$', 'XXX'), '^')
 10    within group (order by lvl) result
 11  from inter;

RESULT
-----------------------------------------------------------------------------

XXX^Vinoth Karthick Vinoth^XXX^XXX

SQL>
person Littlefoot    schedule 26.04.2018
comment
Это не удается Vinoth^Vinoth Karthick :Vinoth^Vinoth^Vinoth - person MT0; 01.05.2018
comment
И, вероятно, на нескольких других примерах, @MT0, но это не то, что ОП назвал вводом. - person Littlefoot; 01.05.2018
comment
OP хотел заменить весь элемент строки с разделителями ^ - вы меняете разделитель (когда вам это не нужно), и теперь он обрабатывает его как список с разделителями, где разделителем является либо ^, либо :, что неверно. Измените регулярное выражение для поиска символов без знака вставки, и у вас не будет проблемы, а просто отклоните проблему из-под контроля, поскольку она не соответствует узкому примеру, который дал OP, а не намерение вопроса является неискренним и не помогите будущим пользователям с похожей проблемой. - person MT0; 01.05.2018