It seems like you only need to escape the closing character, but not the starting one.
iex(2)> IO.inspect ~r{[A-Z]\{3\}}, structs: false
%{
__struct__: Regex,
opts: "",
re_pattern: {:re_pattern, 0, 0, 0,
<<69, 82, 67, 80, 110, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 255, 255, 255, 255,
255, 255, 255, 255, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,
0, ...>>},
re_version: {"8.41 2017-07-05", :little},
source: "[A-Z]\\{3}"
}
~r/[A-Z]\{3}/
iex(4)> IO.inspect ~r([A-Z]{3}), structs: false
%{
__struct__: Regex,
opts: "",
re_pattern: {:re_pattern, 0, 0, 0,
<<69, 82, 67, 80, 109, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 255, 255, 255, 255,
255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
...>>},
re_version: {"8.41 2017-07-05", :little},
source: "[A-Z]{3}"
}
~r/[A-Z]{3}/
iex(5)> IO.inspect ~r{[A-Z]{3\}}, structs: false
%{
__struct__: Regex,
opts: "",
re_pattern: {:re_pattern, 0, 0, 0,
<<69, 82, 67, 80, 109, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 255, 255, 255, 255,
255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
...>>},
re_version: {"8.41 2017-07-05", :little},
source: "[A-Z]{3}"
}
~r/[A-Z]{3}/