Запрос на замену строки соответствующим шаблоном

#regex #oracle #replace

#регулярное выражение #Oracle #заменить

Вопрос:

У меня есть строка, подобная приведенной ниже.

‘comp’ как «КОМПЬЮТЕР», ‘ms’ как «МЫШЬ», ‘keybr’ как «КЛАВИАТУРА», ‘MONT’ как «МОНИТОР»,

Можно ли написать запрос, чтобы я получил результат в виде

‘comp’,’ms’,’keybr’,’MONT’ ,

Я могу заменить строку «как» пустой строкой, используя запрос REPLACE. Но как мне удалить строку внутри двойных кавычек?

Кто-нибудь может мне помочь в этом? Заранее спасибо.

Ответ №1:

 select replace(
               regexp_replace('''comp'' as "COMPUTER"'
                              , '(".*")'
                              ,null)
               ,' as '
               ,null)
from dual
  

Регулярное выражение '(".*")' выбирает текст, заключенный в двойные кавычки.

Редактировать:

регулярное выражение заменило всю длину соответствующего шаблона. Итак, нам может потребоваться сначала обозначить строку, используя запятую в качестве разделителя, и применить регулярное выражение. Позже присоединитесь к нему.( LISTAGG )

 WITH str_tab(str1, rn) AS
(SELECT regexp_substr(str, '[^,] ', 1, LEVEL), -- delimts
        LEVEL 
   FROM (SELECT '''comp'' as "computer",''comp'' as "computer"' str
           FROM dual) tab
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ','))   1)
SELECT listagg(replace(
               regexp_replace(str1
                              , '(".*")'
                              ,null)
               ,' as '
               ,null), ',') WITHIN GROUP (ORDER BY rn) AS new_text
  FROM str_tab;
  

ПРАВКА2:

Более чистый подход от @EatAPeach

 with x(y) as (
  select q'<'comp' as "COMPUTER",'ms' as "MOUSE" ,'keybr' as "KEYBOARD",'MONT' as "MONITOR",>'
  from dual
)
select y,
       regexp_replace(y, 'as ".*?"' ,null)
from x;
  

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

1. Я попробовал этот способ — выберите replace( regexp_replace(«‘comp» как «КОМПЬЮТЕР», «ms» как «МЫШЬ», «keybr» как «КЛАВИАТУРА», «MONT» как «МОНИТОР»,’ , ‘(«.*»)’ , null) ,’ как ‘, null) из dual

2. Я получаю только это: ‘comp’,

3. Не могли бы вы мне помочь

4. @OracleUser, нет необходимости в маркировке и агрегировании. Вы можете использовать не жадный квантификатор, .*? в вашем первом запросе.