2016-12-28 2 views
0

Im пытается создать регулярное выражение для этого запроса:Postgres регулярного выражения заменить не работает

SELECT gruppo 
FROM righe_conto_ready 
WHERE regexp_replace(gruppo,'(\[{1})|(\].*?\[)|(\].*$)','','g') = '[U6][U53]' 
LIMIT 10 

Это является примером столбца «Gruppo»:

[U6] CAFFETTERIA [U43] THE E TISANE 

Im в настоящее время использует этот запрос для тестирования:

SELECT regexp_replace(gruppo,'(\[{1})|(\].*?\[)|(\].*$)','','g') FROM .... 

и возвращает только U6

Как изменить регулярное выражение, чтобы удалить все внешние скобки?

+0

Что такое внешние скобки? – revo

+1

Попробуйте '' \ [| \] [^] [] * \ [| \] [^] [] * $ ''regex. –

ответ

1

Вы можете использовать regexp_matches() с гораздо более простым регулярным выражением:

with righe_conto_ready(gruppo) as (
    select '[U6] CAFFETTERIA [U43] THE E TISANE'::text 
) 

select gruppo 
from righe_conto_ready, 
lateral regexp_matches(gruppo, '\[.+?\]', 'g') matches 
group by 1 
having string_agg(matches[1], '') = '[U6][U43]' 

       gruppo     
----------------------------------------- 
[U6] CAFFETTERIA [U43] THE E TISANE 
(1 row) 

Когда вы ищете нескольких матчей какой-то шаблон, regexp_matches() кажется более естественным, чем regexp_replace().

Вы можете также искать для первых двух подстрок в скобках (без g флага функция не дает не более чем один ряд):

select gruppo 
from righe_conto_ready, 
lateral regexp_matches(gruppo, '(\[.+?\]).*(\[.+?\])') matches 
where concat(matches[1], matches[2]) = '[U6][U43]' 
+0

Это помогло мне ... Спасибо! – Vanojx1

 Смежные вопросы

  • Нет связанных вопросов^_^