1

Вопрос по regex – Ищите более чистое решение RegEx для сопоставления различных форматов для SSN

Чтобы увидеть, что я хочу, проверьте регулярное выражение, которое я использую. Я попытаюсь объяснить это на английском. Я хочу соответствовать4444 или же444444444 или же444-44-4444. Here's what i have and it does what I want.

^[0-9]{9}$|^[0-9]{4}$|^[0-9]{3}-[0-9]{2}-[0-9]{4}$

Есть ли способ сделать это без операционных? Я думал об этом

([0-9]{3}-?[0-9]{2}-?)?[0-9]{4}

но это позволяет222-222222 который я хочу исключить.

Вы смотрели<a href="http://regexlib.com/Search.aspx?k=ssn&amp;AspxAutoDetectCookieSupport=1" rel="nofollow noreferrer">at these</a>? Кажется, есть некоторые дополнительные ограничения на SSN, например, запрет на все нули в любом подразделе, SSN, начинающиеся с 666 и т. д., которые вы можете рассмотреть.

Apr 05, 2012, 6:30 PMот

Какую реализацию регулярных выражений вы используете? Grep? JavaScript? питон? Perl?

Apr 05, 2012, 6:22 PMот

Является<code>4444</code> действительный номер SSN?

Apr 05, 2012, 6:02 PMот

2ответа

1

Вы должны быть в состоянии сделать это с помощью обратных ссылок:

^(?:\d{3}(-?)\d{2}\1)?\d{4}$

Если- присутствует, оно захвачено и на него можно ссылаться\1, Если его нет,\1 будет просто пустым. Так что это по существу означает: если- находится в этой позиции, она должна быть и в другой позиции.

DEMO

0

Шаблон, помеченный как фактический ответ, завершается ошибкой, поскольку он не соответствует спецификации США для действительных номеров SSN!

При использовании аннулирующего совпадения этот шаблон работает и выбрасывает 000 и 666 или числа, которые начинаются с 9xx в соответствии с правительственной спецификацией.Рандомизация номеров социального страхования

# To use this regex pattern specify IgnoreWhiteSpace due to these comments.
^                           # Beginning of line anchor      
(?!9)                       # Can't be 900- 999                                   
(?!000)                     # If it starts with 000 its bad (STOP MATCH!)
(?!666)                     # If it starts with 666 its bad (STOP MATCH!)
(?<FIRST>\d{3})             # Match the First three digits and place into First named capture group
(?:[\s\-]?)                 # Match but don't capture a possible space or dash
(?<SECOND>\d\d)             # Match next two digits
(?:[\s-]?)                  # Match but don't capture a possible space or dash
(?<THIRD>\d{4})             # Match the final for digits
$                           # EOL anchor

Я описываю использование недействительного соответствия в моей статье в блогеИнвалидатор совпадений регулярных выражений (регулярных выражений) (?!) В .Net.

RelatedQuestions