Usar regexp_replace para reemplazar comillas simples alrededor de una cadena pero no dentro de palabras, por ejemplo, no se puede

Usar regexp_replace para reemplazar comillas simples alrededor de una cadena pero no dentro de palabras, por ejemplo, no se puede

Estoy usando el siguiente código de un script bash para reemplazar las comillas simples de mi columna de título en una base de datos de Postgres con espacios.

psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"

Mi problema es que tenía la intención de eliminar las comillas simples alrededor de las cadenas, por ejemplo, así:

this is example 'number one' ok

se convierte

this is example  number one  ok 

Esto funciona como esperaba. Sin embargo, también elimina las comillas simples dentro de las palabras, por lo que:

can't

se convierte

can t

¿Cómo puedo especificar que solo quiero reemplazar las comillas simples alrededor de las cadenas?

Respuesta1

No creo que haya una buena manera de hacerlo con un solo reemplazo. Pero si cuatro reemplazos están bien, proceda de la siguiente manera:

  1. Reemplazar \A'por  (es decir, reemplazar 'al principio de la cadena).

  2. Reemplazar '\Zpor  (es decir, reemplazar 'al final de la cadena).

  3. Reemplazar globalmente ([^[:alnum:]])'por  \1(es decir, reemplazar cada secuencia de un carácter no alfanumérico y 'por el carácter no alfanumérico y ).

  4. Reemplazar globalmente '([^[:alnum:]])por  \1(es decir, reemplazar cada secuencia de 'y un carácter no alfanumérico por  y el carácter no alfanumérico).

El efecto neto es reemplazar todos ', excepto aquellos que están precedidosyseguido de un carácter alfanumérico.

Descargo de responsabilidad: no tengo idea sobre PostgreSQL; usted mismo debe traducirlo a la sintaxis de PostgreSQL.

Respuesta2

Utilice una expresión regular más inteligente: si reemplaza " '" y " '" ( SPACE APOSTROPHEy APOSTROPHE SPACE), se perderán los apóstrofes dentro de las palabras.

Respuesta3

Si desea evitar los apóstrofes en las palabras, busque apóstrofes, que no tienen letra a la izquierda ni a la derecha. Una posible expresión regular para buscar tales apóstrofes podría ser

([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])

o más corto

\'([^A-Za-z])|([^A-Za-z])\'

o incluso más corto

\'([^\w])|([^\w])\'

Supongo que regexp_replace sería

regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')

No estoy familiarizado con psql, por lo que la sinatx correcta podría ser

regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')

información relacionada