OK, znalazłem odpowiedź. Najwyraźniej muszę dwukrotnie ominąć ukośnik odwrotny w zamianie. Ponadto muszę E
- przedrostek i podwójne ukośniki we wzorcu wyszukiwania w starszych wersjach postgresa (w moim przypadku 8.3). Ostateczny kod wygląda tak:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Tak, wygląda okropnie, ale działa :)