Usando regexp_replace para substituir aspas simples em torno de string, mas não dentro de palavras, por exemplo, não é possível

Usando regexp_replace para substituir aspas simples em torno de string, mas não dentro de palavras, por exemplo, não é possível

Estou usando o código abaixo de um script bash para substituir aspas simples da minha coluna de título em um banco de dados postgres por espaços.

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

Meu problema é que eu pretendia remover aspas simples em torno de strings, por exemplo, assim:

this is example 'number one' ok

torna-se

this is example  number one  ok 

Isso funciona como eu esperava. No entanto, também remove as aspas simples das palavras, então:

can't

torna-se

can t

Como posso especificar que desejo apenas substituir as aspas simples nas strings.

Responder1

Não acho que haja uma maneira legal de fazer isso com apenas uma substituição. Mas se quatro substituições estiverem bem, proceda da seguinte forma:

  1. Substitua \A'por  (ou seja, substitua 'no início da string).

  2. Substitua '\Zpor  (ou seja, substitua 'no final da string).

  3. Substitua globalmente ([^[:alnum:]])'por  \1(ou seja, substitua todas as sequências de um caractere não alfanumérico e 'pelo caractere não alfanumérico e ).

  4. Substitua globalmente '([^[:alnum:]])por  \1(ou seja, substitua cada sequência de 'e um caractere não alfanumérico por  e o caractere não alfanumérico).

O efeito líquido é substituir todos ', exceto aqueles que são precedidoseseguido por um caractere alfanumérico.

Isenção de responsabilidade: não tenho ideia sobre o PostgreSQL; você mesmo deve traduzi-lo para a sintaxe do PostgreSQL.

Responder2

Use um regex mais inteligente: se você substituir " '" e " '" ( SPACE APOSTROPHEe APOSTROPHE SPACE), perderá os apóstrofos intra-palavras.

Responder3

Se você quiser evitar apóstrofos nas palavras, procure apóstrofos, que não possuem letra esquerda ou direita. Uma possível expressão regular para procurar tais apóstrofos poderia ser

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

ou mais curto

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

ou até mais curto

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

Eu acho que regexp_replace seria

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

Não estou familiarizado com o psql, então a sintaxe correta pode ser

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

informação relacionada