Ваша первая альтернатива, которая соответствует буквам, имеет только якорь ^
, поэтому она просто проверяет, что ввод начинается с 3 букв или 2 букв, разделенных дефисом.
Ваша вторая альтернатива имеет только $
якорь, поэтому он просто проверяет, что конец ввода состоит из 4 цифр.
Вам нужно поместить оба якоря в обе альтернативы.
^([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])$|^[0-9]{4}$
или расположить другую группу вокруг всего, кроме якорей.
^(([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])|[0-9]{4})$