2012-07-30 18 views
26

Ho una tabella che contiene un numero di righe con colonne contenenti un URL. L'URL è della forma:Espressione regolare trova e sostituisce in Postgres

http://one.example1.com:9999/dotFile.com

Vorrei sostituire tutte le partite in quella colonna con http://example2.com/dotFile.com pur mantenendo tutto dopo: 9999. Ho trovato della documentazione su regexp_matches e regexp_replace, ma non riesco a capirlo.

risposta

27

se si conosce l'URL, non è necessario utilizzare regex. funzione di sostituzione() dovrebbe funzionare per voi:

replace(string text, from text, to text)   
Replace all occurrences in string of substring from with substring to 
example: replace('abcdefabcdef', 'cd', 'XX') abXXefabXXef 

si potrebbe provare:

replace(yourcolumn, 'one.example1.com:9999','example2.com') 
+1

+1 per l'approccio pragmatico. – Tomalak

+5

Grazie, ha funzionato. tabella di aggiornamento campo SET = replace (campo, 'one.example1.com:9999','esempio2.com') – ringocub

40

Per sostituire una stringa fissa, utilizzare la semplice funzione replace().

Per sostituire una stringa dinamica, è possibile utilizzare regexp_replace() come questo:

UPDATE 
    YourTable 
SET 
    TheColumn = regexp_replace(
    TheColumn, 'http://[^:\s]+:9999(\S+)', 'http://example2.com\1', 'g' 
) 
+8

'replace()' esegue un lavoro più semplice qui, come già commentato. Tuttavia, per sostituire "tutte le corrispondenze" con 'regexp_replace()', devi aggiungere il 4 ° parametro ''g'' .. per" globalmente ". –

+0

@Erwin Grazie per il suggerimento. L'ho incluso. – Tomalak

+0

Ne cercavo uno che posso usare in una clausola where come UPDATE ... WHERE "email" = regexp_matches ("email", E '. [Co.tz]') 'in modo da filtrare e migliorare la velocità di aggiornamento. Ma va bene anche questo, dato che lo sto facendo solo una volta, in sviluppo. Grazie, perché volevo davvero una soluzione 'regexp'. :) – ArchNoob