Regex для действительного номера SSN или другого идентификатора - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в области регулярных выражений, и у меня есть действительное регулярное выражение для SSN:

/^(\d{3}(\s|-)?\d{2}(\s|-)?\d{4})|[\d{9}]*$/

Но теперь мне нужно расширить его, чтобы он принимал либо SSN, либо другой буквенно-цифровой идентификатор из 7 символов, напримерthis:

/^[a-zA-Z0-9]{7}$/

Я думал, что это будет так же просто, как сгруппировать SSN и добавить OR |но мои тесты все еще не проходят.Вот что у меня сейчас:

/^((\d{3}(\s|-)?\d{2}(\s|-)?\d{4})|[\d{9}])|[a-zA-Z0-9]{7}$/

Что я делаю не так?И есть ли более элегантный способ сказать либо SSN, либо другой мой идентификатор?

Спасибо за любые полезные советы.

Действительные номера SSN:

  • 123-45-6789
  • 123456789
  • 123 45 6789

Действительный идентификатор: aCe8999

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я также немного изменил ваше первое регулярное выражение, ниже приведена демонстрационная программа.Это согласно моему пониманию проблемы.Дайте мне знать, если какие-либо изменения необходимы.

my @ids = (
    '123-45-6789',
    '123456789',
    '123 45 6789',
    '1234567893434',  # invalid
    '123456789wwsd',  # invalid
    'aCe8999',
    'aCe8999asa' # invalid
);

for (@ids) {
    say "match = $&" if $_ =~ /^ (?:\d{3} ([ \-])? \d{2} \1? \d{4})$ | ^[a-zA-Z0-9]{7}$/x ;
}

Вывод:

match = 123-45-6789
match = 123456789
match = 123 45 6789
match = aCe8999
0 голосов
/ 22 февраля 2019

У вашего первого регулярного выражения есть некоторые проблемы.Важно то, что он принимает {{{{}}}}}, что означает, что вы создали неправильный класс символов.Также оно соответствует 123-45 6789 (обратите внимание на сочетание пробела и тире).

Для обозначения ИЛИ в регулярных выражениях вам нужно использовать трубу | и помнить, что каждый символ принадлежит той стороне, в которой он находится.Так, например, ^1|2$ проверяет строки, начинающиеся с 1 или заканчивающиеся 2, а не только двумя отдельными входными строками 1 и 2.

Чтобы применить точное совпадение, которое вам нужно сделать ^1$|^2$ или ^(1|2)$.

Со вторым регулярным выражением ^[a-zA-Z0-9]{7}$ вы не говорите буквенно-цифровой идентификатор из 7 символов , но вы говорите числовой, буквенный или буквенно-цифровой.Так что это соответствует 1234567 тоже.Если это не проблема, то следующее правило является решением путем устранения указанных проблем:

^\d{3}([ -]?)\d\d\1\d{4}$|^[a-zA-Z0-9]{7}$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...