2016-12-28 4 views
0

Im einen regulären Ausdruck für diese Abfrage zu erstellen versuchen:Postgres regexp replace nicht funktioniert

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

Dies ist ein Beispiel für 'gruppo' Spalte:

[U6] CAFFETTERIA [U43] THE E TISANE 

Im derzeit diese Abfrage für Tests mit:

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

und es gibt nur U6

Wie kann ich die Regexp ändern, um alles außerhalb der Klammern zu entfernen?

+0

Was außerhalb Klammer sind? – revo

+1

Versuchen Sie ''\ [| \] [^] [] * \ [| \] [^] [] * $'' regex. –

Antwort

1

Sie können regexp_matches() mit dem viel einfacheren regulären Ausdruck verwenden:

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) 

Wenn Sie für mehrere Übereinstimmungen einige Muster suchen, regexp_matches() als regexp_replace() natürlicher scheint.

Sie können auch für die ersten beiden Teile in Klammer (ohne die g Flagge der Funktion liefert nicht mehr als eine Zeile) suchen:

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

Das hat mir geholfen ... Danke! – Vanojx1