Вам необходимо использовать
String.replace("_foo%_bar", ~r/_|%/, "\\\\\\0")
Здесь "\\\\"
определяет 2 литеральных \
символа, которые анализируются как один литерал \
char в замене, а "\\0"
анализируется какa \0
, обратная ссылка на все значение совпадения.
Вы также можете использовать
String.replace("_foo%_bar", ~r/_|%/, ~S(\\\0))
, чтобы избежать переэкранирования, так как ~S
сигил не позволяетescape-последовательности и обратные слеши имеют буквальное значение внутри них.