OK, ho trovato la risposta. Apparentemente, ho bisogno di evitare due volte la barra rovesciata nella sostituzione. Inoltre, ho bisogno di E
-prefisso e barre rovesciate a doppio escape nel modello di ricerca su versioni precedenti di postgres (8.3 nel mio caso). Il codice finale è simile al seguente:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Sì, sembra orribile, ma funziona :)