regex_replace в оракуле sql - PullRequest
       1

regex_replace в оракуле sql

0 голосов
/ 19 марта 2019

Я не специалист по регулярным выражениям, и в Oracle я хочу найти строку в тексте, используя функцию regexp_replace(0.

Строка для поиска имеет в начале "[" и в конце "]". Между "[" и "]" вы найдете буквы и символы "_".

Итак, если у меня есть этот текст:

идентификаторы: [tag1], [tag2], [tag3] ..... [tagN]

как я могу удалить [и]?

Мне нужно получить

идентификаторы: tag1, tag2, tag3 ...., tagN

Я пробовал это:

select REGEXP_REPLACE('the ID's are [tag1] , [tag2] , [tag3].........','[(.*?)]') from dual

но это не работает.

Поле, содержащее текст, находится в таблице с минимум миллионами записей.

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Ответ на оригинальный вопрос:

with s as (select 'the ID''s are [tag1] , [tag2] , [tag3]' str from dual)
select
regexp_replace(regexp_replace(regexp_replace(str, '\[.*?\]', '221'  , 1, 1)
                                                , '\[.*?\]', '342'  , 1, 1)
                                                , '\[.*?\]', '13412', 1, 1) as str
from s;

STR
------------------------------
the ID's are 221 , 342 , 13412

Ответ на измененный вопрос:

with s as (select 'the ID''s are [tag1] , [tag2] , [tag3]' str from dual)
select
replace(replace(str, ']'), '[') str
from s;

STR
-------------------------------
the ID's are tag1 , tag2 , tag3
1 голос
/ 19 марта 2019

Почему бы просто не заменить [ и ]?

select translate(text, 'x[]', 'x')
1 голос
/ 19 марта 2019

Вы можете использовать

with t(str) as
(
 select 'the ID''s are [tag1] , [tag2] , [tag3]' from dual
), t2(str2) as
(
 select regexp_substr(str,'[^\[]+', 1, 1) from t
)
select concat( regexp_substr(str,'[^\[]+', 1), 
         listagg(replace(regexp_substr(str,'[^\[]*.[^\]]', 1, level),']',''),',') 
              within group (order by 1) ) 
       as "Derived String"       
  from t 
 cross join t2 
 connect by level <= regexp_count(str,'\[');

Derived String
---------------------------
the ID's are tag1,tag2,tag3

Демо

Редактировать 1 : Если вы хотите динамически извлекать только теги как

tag1 tag2 tag3 .... tag n

затем используйте ниже

with t(str) as
(
 select 'the ID''s are [tag1] , [tag2] , [tag3]' from dual
)
select   listagg(replace(regexp_substr(str,'[^\[]*.[^\]]', 1, level),']',''),' ') 
              within group (order by 1) 
       as "Derived String"       
  from t  
 connect by level <= regexp_count(str,'\[') 

Редактировать 2 (из-за последнего комментария):

Попробуйте использовать ниже

with t(a,b) as
(
 select 'the ID''s are [tag1] , [tag2] , [tag3]' as a,
        'the ID''s are [tag4] , [tag5] , [tag6], [tag7]' as b
   from dual
)
select   listagg(replace(regexp_substr(a,'[^\[]*.[^\]]', 1, level),']',''),' ') 
              within group (order by 1) 
       as "Derived String 1",
         listagg(replace(regexp_substr(b,'[^\[]*.[^\]]', 1, level),']',''),' ') 
              within group (order by 1) 
       as "Derived String 2"       
  from t  
 connect by level <= greatest(regexp_count(a,'\['),regexp_count(b,'\['));

Derived String 1                  Derived String 2
---------------------------       ---------------------------   
tag1 tag2 tag3                    tag4 tag5 tag6 tag7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...