Ответ 1
(^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$)
должен это сделать.
---- EDIT ----
Как указывает Джоэл, вы также можете сделать ^(\d{3}-?\d{2}-?\d{4}|XXX-XX-XXXX)$
, который немного опрятен.
Может ли кто-нибудь предоставить мне регулярное выражение для SSN, которое соответствует либо
123-45-6789
ИЛИ
ХХХ-ХХ-ХХХХ
В настоящее время у меня есть ^\d{3}-?\d{2}-?\d{4}$
, который соответствует первому выражению, но мне нужно добавить в него второе выражение в качестве альтернативы.
Спасибо!
(^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$)
должен это сделать.
---- EDIT ----
Как указывает Джоэл, вы также можете сделать ^(\d{3}-?\d{2}-?\d{4}|XXX-XX-XXXX)$
, который немного опрятен.
В строго ответьте на вопрос:
^(123-45-6789|XXX-XX-XXXX)$
shoud работа.; -)
Если вы читаете раздел Valid SSNs в статье SSN Википедии, тогда становится ясно, что регулярное выражение для проверки SSN немного более сложным.
Соответственно, немного более точное чистое регулярное выражение SSN будет выглядеть так:
^(?!(000|666|9))\d{3}-(?!00)\d{2}-(?!0000)\d{4}$
Итак, у вас есть: ^\d{3}-?\d{2}-?\d{4}$
Что вам нужно, так это разрешить любой из этих числовых блоков вместо "X". Это также довольно просто, как регулярное выражение - просто приспособите свой существующий к X
вместо \d
в каждом из трех мест: X{3}-?X{2}-?X{4}
Вы не хотите комбинировать числовой код с кодом X, поэтому вам просто нужно разрешить либо один случай, либо другой, поэтому завершите их в скобках, а нам будет символ канала, чтобы указать тот или иной, так:
^((\d{3}-?\d{2}-?\d{4})|(X{3}-?X{2}-?X{4}))$
Вероятно, вы также захотите разрешить использование верхнего или нижнего регистра X. Это можно указать с помощью [Xx]
или, если вы делаете все это без учета регистра, используя модификатор i
вне регулярного выражения.
Тогда это может быть
/^[\dX]{3}-?[\dX]{2}-?[\dX]{4}$/
если вы хотите, чтобы x
тоже был действительным, вы можете добавить модификатор i
в конец:
/^[\dX]{3}-?[\dX]{2}-?[\dX]{4}$/i
С другой стороны, регулярное выражение выше примет
123-xx-xxxx
так что в зависимости от того, хотите ли вы принять эту форму или нет, вы можете используйте свою оригинальную форму "или" другую форму:
/^(\d{3}-?\d{2}-?\d{4})|(xxx-xx-xxxx)$/i
Более общее совпадение было бы следующим:
(^[^-]{3}-?[^-]{3}-?[^-]{4}$)
Это будет соответствовать любой последовательности символов, отличных от "-" в конфигурации 3-3-4 char. Например:
my @str = qw/
1adfasdfa
adsfaouaosd90890
111-232-adafd
xXX-232-1234
111-222-4444
$$%-AF#[email protected]
/;
foreach(@str)
{
print "$_\n" if /^[^-]{3}-?[^-]{3}-?[^-]{4}$/;
}
^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$