OK, fandt svaret. Tilsyneladende er jeg nødt til at undslippe tilbageslaget i udskiftningen. Jeg skal også E
-prefix og double-escape backslashes i søgemønsteret på ældre versioner af postgres (8.3 i mit tilfælde). Den endelige kode ser sådan ud:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Ja, det ser forfærdeligt ud, men det virker :)