Il caso limite della console Postgres non rispetta le regole delle espressioni regolari POSIX?

Ciao, sto cercando di eseguire alcuni comandi regexp_replace nella console pg per convertire i link nella mia istanza di test Discourse che è stata migrata da un enorme forum Drupal 7. Su quasi 2 milioni di post ci sono molti link in formato Textile che devono essere convertiti in Markdown. Questo è quello che sto cercando di usare:

Funziona correttamente nel tester sopra, così come nel mio editor di testo; trasforma questo:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) \"link\":http://www.youtube.com/watch?v=aQjkOmzQ8RT

In questo:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)

Ma nella console pg di Discourse eseguo questo:

  • update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(http\\S+?(?=\\W+(?:$|\\s))|http\\S+)', E'[\\\\1](\\\\2)', 'g');

E ottengo questo:

  • Cqwertyuioy - Lasgfdf Sddgfdds (Dsajjsa Vsjsjk Osaskgkk Spfs) [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT

(Mi scuso per l’anonimizzazione.) Quindi la parte importante è:

  • Corretto: [link](http://www.youtube.com/watch?v=aQjkOmzQ8RT)
  • Sbagliato: [link](http:)//www.youtube.com/watch?v=aQjkOmzQ8RT

Immagino che abbia a che fare con la stranezza del carattere di escape nel caso di query SQL e/o le funzioni speciali di [] e () rispetto ai letterali, ma non riesco a capirlo. Qualche idea? Grazie!

Non conosco PostgreSQL, ma funziona usando la console Rails:

Post.find_each do |p|
  p.raw.gsub!(/\"(.*?)\"\\:(http\\S+?(?=\\W+(?:$|\\s))|http\\S+)/, '[\\\\1](\\\\2)')
  p.save
end
2 Mi Piace

Ah, grazie mille per avermi mostrato come usare la console Rails per questo. Sembra che sia molti ordini di grandezza più lenta rispetto all’esecuzione di un comando SQL grezzo (il che ha senso), quindi riferirò se/quando il comando finirà.

Bene, ho finito per interrompere il processo Rails e sono tornato alla console pg. Ho anche ricevuto un suggerimento per un regexp molto più semplice (e si spera più facile da debuggare) che funziona molto bene anche al di fuori della console pg:
"(.?*)":(\S*)\b

Ma c’è decisamente qualcosa di non standard nella query SQL, questo non ha fatto assolutamente nulla ai collegamenti:
update posts set raw = regexp_replace(raw, '\"(.*?)\":(\S*)\b', E'[\\1](\\2)', 'g');
Né questo:
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(\S*)\b', E'[\\1](\\2)', 'g');

Quindi, cosa succede?