Ваша спецификация немного сбивает с толку. Ваши последние два случая выглядят одинаково:
XXX-XXX-XXXX
XXX-XXXX
(XXX) XXX-XXXX
(XXX) XXX-XXXX
(Похоже, вы пытаетесь сопоставить номер телефона, верно?)
Предполагая, что ваш последний случай - «(XXX) XXX-XXXX» (между пробелом и обычным номером нет пробела, который я предполагаю, что «?» Означает необязательный пробел), тогда ваш RegExp почти верен, просто добавьте две обратные косые черты перед круглые скобки кода области, поэтому они соответствуют простым символам, а не специальным группирующим символам:
^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$
Обратите внимание, что ваше регулярное выражение, возможно, не прошло правильно, я заметил, что переполнение стека удалило одну обратную косую черту из шаблона RE, мне пришлось ввести двойную обратную косую черту "\\", чтобы получить одну обратную косую черту, чтобы получилось в сообщении