OK, j'ai trouvé la réponse. Apparemment, je dois double-échapper la barre oblique inverse dans le remplacement. Aussi, j'ai besoin de E
-prefix et double-échappement antislash dans le modèle de recherche sur les anciennes versions de postgres (8.3 dans mon cas). Le code final ressemble à ceci :
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Oui, ça a l'air horrible, mais ça marche :)