2012-07-30 19 views
26

Tengo una tabla que contiene un número de filas con columnas que contienen una URL. La URL es de la forma:Encontrar y reemplazar expresiones regulares en Postgres

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

quisiera sustituir todos los partidos de esa columna con http://example2.com/dotFile.com conservando todo después de 9999. He encontrado documentación sobre regexp_matches y regexp_replace, pero no puedo entenderlo.

Respuesta

27

si conoce la url, no tiene que usar regex. reemplazar la función() debe trabajar para usted:

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

usted podría intentar:

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

+1 para el enfoque pragmático. – Tomalak

+5

Gracias, eso funcionó. tabla de actualización SET campo = reemplazar (campo, 'one.example1.com:9999'''example2.com') – ringocub

40

Para reemplazar una cadena fija, utilice la función simple replace().

Para reemplazar una cadena dinámica, puede utilizar regexp_replace() así:

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

'replace()' hace un trabajo más simple aquí, como ya lo comentó usted mismo. Sin embargo, para reemplazar "todas las coincidencias" por 'regexp_replace()', debe agregar el 4 ° parámetro ''g'' .. para" globalmente ". –

+0

@Erwin Gracias por la pista. He incluido eso. – Tomalak

+0

Estaba buscando uno que pueda usar en una cláusula where como 'UPDATE ... WHERE" email "= regexp_matches (" email ", E '. [Co.tz]')' para filtrar y mejorar la velocidad de actualización. Pero esto también está bien, ya que solo lo hago una vez, en desarrollo. Gracias, porque realmente quería una solución 'regexp' aunque. :) – ArchNoob

Cuestiones relacionadas