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

1

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

<code>^[0-9]{9}$|^[0-9]{4}$|^[0-9]{3}-[0-9]{2}-[0-9]{4}$
</code>

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

<code>([0-9]{3}-?[0-9]{2}-?)?[0-9]{4}
</code>

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

Является4444 действительный номер SSN? alan
Вы смотрелиat these? Кажется, есть некоторые дополнительные ограничения на SSN, например, запрет на все нули в любом подразделе, SSN, начинающиеся с 666 и т. д., которые вы можете рассмотреть. ire_and_curses
Какую реализацию регулярных выражений вы используете? Grep? JavaScript? питон? Perl? alan

Ваш Ответ

2   ответа
1

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

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

DEMO

Феликс-Клинг@ модификатор не работает) Я думаю, что это должно быть^(?:\d{3}(-?)\d{2}\1)?\d{4}$ т.е.(-?) вместо(-)?  По некоторым причинам это не будет работать для меня иначе.
Afaik, завершение имени пользователя не появляется, если единственный другой пользователь является владельцем потока ... Я получаю уведомление о любом комментарии. И вы также получили уведомление, хотя я не использовал@alan ;)
Он работал в javascript, но не в Java, что мне было нужно, и забыл указать в моем вопросе. Я закончил с менее элегантным ^ ([0-9] {3} [0-9] {2})? [0-9] {4} $ | ^ [0-9] {3} - [0 -9] {2} - [0-9] {4} $ во имя времени. Dale
Интересно ... на каком языке вы проверяли? Это сработало для меня в JavaScript. Но если подумать, это тоже имеет смысл ...
Он не работал в Python. И у меня есть текстовый редактор, который (я думаю) использует реализацию регулярных выражений Perl. Это тоже не сработало. Но это сработало в обоих случаях, когда я? внутри скобок. (По другой теме: когда я набираю@ в комментарии ваше имя пользователя не всплывает, чтобы я мог вставить@Felix Kling, Может из-за космоса? Ты знаешь как это обойти?)
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.

Похожие вопросы