Elixir中的String.replace

时间:2017-10-11 12:13:35

标签: elixir

我需要转换此字符串

"/{foo}/{bar}.{format}"

in

"/#{a["foo"]}/#{a["bar"]}.#{a["format"]}"

因为我有一个包含这些属性的列表。 例如

a["foo"] = "home"
a["bar"] = "picture"
a["format"] = "jpg"

我尝试这样的事情

String.replace(a,"{",~s(#{))

但我得到了这个错误(

  

SyntaxError)iex:8:意外令牌:)

我甚至尝试使用正则表达式来创建一个List以尝试获得我的结果,但我不明白如何应用此正则表达式([^{]*?)\w(?=\})

2 个答案:

答案 0 :(得分:5)

假设您希望将字符串"/home/picture.jpg"作为结果,则可以将Regex.replace/3与替换函数一起使用:

map = %{
  "foo" => "home",
  "bar" => "picture",
  "format" => "jpg",
}

string = "/{foo}/{bar}.{format}"

Regex.replace(~r/{([a-z]+)?}/, string, fn _, match ->
  map[match]
end)
|> IO.inspect

输出:

"/home/picture.jpg"

答案 1 :(得分:5)

在sigil中使用大写S

iex> a = "/{foo}/{bar}.{format}"
iex> IO.puts String.replace(a,"{",~S(#{))
/#{foo}/#{bar}.#{format}

这里解释了Sigils:https://elixir-lang.org/getting-started/sigils.html#interpolation-and-escaping-in-sigils