Oké, het antwoord gevonden. Blijkbaar moet ik de backslash dubbel escapen in de vervanging. Ik moet ook E
-prefix en dubbele escape-backslashes in het zoekpatroon op oudere versies van postgres (8.3 in mijn geval). De uiteindelijke code ziet er als volgt uit:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Ja, het ziet er verschrikkelijk uit, maar het werkt :)