Оказывается, я был действительно близок, но из-за способа компиляции шаблона мне нужно было избежать побега (потому что он получен в строковом формате)
Итак, я пошел;
pattern: "^[a-zA-Z0-9._\-:]*$"
до ...
pattern: "^[a-zA-Z0-9._\\-:]*$"
У меня не было бы этой проблемы, если бы я писал регулярное выражение непосредственно в его использовании, но поскольку оно выводилось из фида JSON в виде строки, ему нужно было экранировать (дважды)