(我假设你的地图有串钥匙,而不是原子)
如果你的罚款由一个运行的替代品之一,你可以简单地使用Enum.reduce
与String.replace
:
iex(1)> my_map = %{"old_value1" => "new_value1", "old_value2" => "new_value2"}
%{"old_value1" => "new_value1", "old_value2" => "new_value2"}
iex(2)> str = "some string .......old_value1 fafdsfd old_value2 faaaaaaa"
"some string .......old_value1 fafdsfd old_value2 faaaaaaa"
iex(3)> Enum.reduce(my_map, str, fn {old, new}, str -> String.replace(str, old, new) end)
"some string .......new_value1 fafdsfd new_value2 faaaaaaa"
但是,如果你想并行运行它们,为了性能或者正确性(如果地图上的任何键匹配任何其他值,以前的解决方案将给出不同的结果),我会使用类似:binary.compile_pattern
,:binary.match
和模式匹配:
defmodule Main do
def replace(string, map) do
replace(string, map, :binary.compile_pattern(Map.keys(map)), "")
end
defp replace(string, map, pattern, acc) do
case :binary.match(string, pattern) do
{start, length} ->
<<before::binary-size(start), match::binary-size(length), rest::binary>> = string
replacement = map[match]
replace(rest, map, pattern, acc <> before <> replacement)
:nomatch ->
acc <> string
end
end
end
my_map = %{"old_value1" => "new_value1", "old_value2" => "new_value2"}
str = "some string .......old_value1 fafdsfd old_value2 faaaaaaa"
IO.puts Main.replace(str, my_map)
输出:
some string .......new_value1 fafdsfd new_value2 faaaaaaa
是什么'<<前::二进制大小(开始),匹配::二进制尺寸(长度),其余::二进制>>'怎么办? – Johshi
它将右手边的值分割成3个大小为'start','length'和剩下的大小的二进制文件,并将它们分别分配给''before','match'和'rest'。 – Dogbert
但什么是“<<" and ">>”和“::”? – Johshi