Замена строки обратной ссылкой с обратной косой чертой - PullRequest
0 голосов
/ 11 мая 2018

Я хочу заменить все _ и % в строке на \_ и \% соответственно.

Я пытался

String.replace("_foo%_bar", ~r/_|%/, "\\\\0")

Но это только производит "\\0foo\\0\\0bar".

Как правильно избежать первого обратного слеша, чтобы не влиять на синтаксис обратных ссылок?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вам нужна еще одна пара обратной косой черты:

iex(1)> IO.puts String.replace("_foo%_bar", ~r/_|%/, "\\\\\\0")
\_foo\%\_bar

Но я бы предложил использовать Regex.replace/3 с функцией в качестве обратного вызова здесь:

iex(2)> IO.puts Regex.replace(~r/_|%/, "_foo%_bar", &("\\" <> &1))
\_foo\%\_bar
0 голосов
/ 11 мая 2018

Вам необходимо использовать

String.replace("_foo%_bar", ~r/_|%/, "\\\\\\0")

Здесь "\\\\" определяет 2 литеральных \ символа, которые анализируются как один литерал \ char в замене, а "\\0" анализируется какa \0, обратная ссылка на все значение совпадения.

Вы также можете использовать

String.replace("_foo%_bar", ~r/_|%/, ~S(\\\0))

, чтобы избежать переэкранирования, так как ~S сигил не позволяетescape-последовательности и обратные слеши имеют буквальное значение внутри них.

...