Okej, hittade svaret. Tydligen måste jag dubbel-undkomma snedstrecket i ersättaren. Jag måste också E
-prefix och double-escape backslashes i sökmönstret på äldre versioner av postgres (8.3 i mitt fall). Den slutliga koden ser ut så här:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Ja, det ser hemskt ut, men det fungerar :)