【问题标题】:Replacing string with back reference preceeded with backslash用反斜杠前面的反向引用替换字符串
【发布时间】:2018-05-11 18:17:36
【问题描述】:

我想将字符串中的所有_% 分别替换为\_\%

我试过了

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

但这只会产生"\\0foo\\0\\0bar"

如何正确转义第一个反斜杠而不影响反向引用语法?

【问题讨论】:

  • 可以使用字符列表:[92, 48]

标签: regex string elixir


【解决方案1】:

你需要使用

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

这里,"\\\\" 定义了 2 个文字 \ 字符,它们在替换中被解析为单个文字 \ 字符,"\\0" 被解析为 \0,即对整个匹配值的反向引用。

你也可以使用

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

为了避免过度转义,因为~S sigil 不允许转义序列,反斜杠在其中具有字面意义。

【讨论】:

    【解决方案2】:

    你还需要一对反斜杠:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多