Okay, Antwort gefunden. Anscheinend muss ich den Backslash in der Ersetzung doppelt maskieren. Außerdem muss ich E
-Präfix und doppelte Escape-Backslashes im Suchmuster bei älteren Versionen von Postgres (in meinem Fall 8.3). Der endgültige Code sieht folgendermaßen aus:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Ja, es sieht schrecklich aus, aber es funktioniert :)