【问题标题】:String.replace in Elixir长生不老药中的 String.replace
【发布时间】:2017-10-11 20:21:11
【问题描述】:

我需要转换这个字符串

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

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

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

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

我尝试这样的事情

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

但是我收到了这个错误(

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

我什至尝试了一个正则表达式来创建一个列表来尝试得到我的结果,但我不明白如何应用这个正则表达式([^{]*?)\w(?=\})

【问题讨论】:

    标签: elixir


    【解决方案1】:

    假设您想要字符串 "/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"
    

    【讨论】:

      【解决方案2】:

      在印记中使用大写S

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

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

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多