【发布时间】:2018-05-11 18:17:36
【问题描述】:
我想将字符串中的所有_ 和% 分别替换为\_ 和\%。
我试过了
String.replace("_foo%_bar", ~r/_|%/, "\\\\0")
但这只会产生"\\0foo\\0\\0bar"。
如何正确转义第一个反斜杠而不影响反向引用语法?
【问题讨论】:
-
可以使用字符列表:
[92, 48]
我想将字符串中的所有_ 和% 分别替换为\_ 和\%。
我试过了
String.replace("_foo%_bar", ~r/_|%/, "\\\\0")
但这只会产生"\\0foo\\0\\0bar"。
如何正确转义第一个反斜杠而不影响反向引用语法?
【问题讨论】:
[92, 48]
你需要使用
String.replace("_foo%_bar", ~r/_|%/, "\\\\\\0")
这里,"\\\\" 定义了 2 个文字 \ 字符,它们在替换中被解析为单个文字 \ 字符,"\\0" 被解析为 \0,即对整个匹配值的反向引用。
你也可以使用
String.replace("_foo%_bar", ~r/_|%/, ~S(\\\0))
为了避免过度转义,因为~S sigil 不允许转义序列,反斜杠在其中具有字面意义。
【讨论】:
你还需要一对反斜杠:
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
【讨论】: