Le cas limite de la console Postgres n'obéit pas aux règles d'expression régulière POSIX ?

Salut, j’essaie d’exécuter des commandes regexp_replace dans la console pg pour convertir des liens dans mon instance Discourse de test qui a été migrée depuis un énorme forum Drupal 7. Sur près de 2 millions de messages, il y a un tas de liens au format Textile qui doivent être convertis en Markdown. Voici ce que j’essaie d’utiliser :

Cela fonctionne correctement dans le testeur ci-dessus ainsi que dans mon éditeur de texte ; cela transforme ceci :

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

En ceci :

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

Mais dans la console pg de Discourse, j’exécute ceci :

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

Et j’obtiens ceci :

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

(Désolé pour l’anonymisation.) Donc la partie importante est :

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

J’imagine que cela a quelque chose à voir avec la bizarrerie du caractère d’échappement dans le cas des requêtes SQL et/ou les fonctions spéciales de [] et () par rapport aux littéraux, mais je n’arrive pas à le comprendre. Des idées ? Merci !

Je ne connais pas PostgreSQL, mais cela fonctionne en utilisant la console Rails :

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

Ah, merci beaucoup de m’avoir montré comment utiliser la console Rails pour cela. Il semble qu’elle soit beaucoup plus lente que l’exécution d’une commande SQL brute (ce qui est logique), je ferai donc un compte rendu si/quand la commande sera terminée.

Eh bien, j’ai fini par abandonner le processus Rails et je suis retourné à la console pg. J’ai également reçu une suggestion pour une expression régulière beaucoup plus simple (et j’espère plus facile à déboguer) qui fonctionne très bien en dehors de la console pg :
\"(.*?)\":(\\S*)\\b

Mais il y a certainement quelque chose de non standard dans la requête SQL, cela n’a eu aucun effet sur les liens :
update posts set raw = regexp_replace(raw, '\"(.*?)\":(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');
Ni ceci :
update posts set raw = regexp_replace(raw, '\"(.*?)\"\\:(\\S*)\\b', E'[\\\\1](\\\\2)', 'g');

Alors, qu’est-ce qui se passe ?