Регулярное выражение для проверки номера британского национального страхования

У меня есть следующее регулярное выражение, которое подтверждает британский номер национального страхования

^([a-zA-Z]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([a-zA-Z]){1}?$

Принятые значения:

AB 12 34 56 A

AB123456A

Я хочу, чтобы эти значения также принимались. может кто-нибудь, пожалуйста, помогите мне разобраться в этом?

AB 123456 A

AB 123 456 A

AB 1 2345 6 A

    AB   12   34   56 A    (multiple space anywhere)

RE должен работать, даже если в строке есть лишние или отсутствующие пробелы. Можно ли это сделать в RE? Заранее благодарю вас.

Ответ 1

Изменить. Эндрю Бауэр изменил мой ответ, чтобы добавить проверки разрешенных/запрещенных символов, которые были неизвестны в то время, когда я ответил. Вы должны проголосовать за его ответ, потому что он более совершенен и, по-видимому, выполняет лучшую проверку.


Если вы не можете сначала удалить все пробелы, это должно работать:

^\s*[a-zA-Z]{2}(?:\s*\d\s*){6}[a-zA-Z]?\s*$

Пояснение:

^                 # beginning of string
\s*               # optional leading whitespace
[a-zA-Z]{2}       # match two letters
(?:\s*\d\s*){6}   # six digits, with optional whitespace leading/trailing
[a-zA-Z]?         # zero or one letter
\s*               # optional trailing whitespace (just in case)
$                 # end of string

Ответ 2

На самом деле, NIN не допускает D, F, I, Q, U или V для первых двух букв и не допускает O для второй буквы; Кроме того, префиксные буквы не могут быть BG, GB, NK, KN, TN, NT и ZZ. Буква суффикса также является A, B, C или D, но может быть представлена ​​пробелом, если неизвестно. - http://en.wikipedia.org/wiki/National_Insurance_number#Format

Таким образом, более действительная проверка будет (я только предоставил версию с заглавными буквами, ее можно легко изменить для нижнего регистра):

^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)(?:[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z])(?:\s*\d\s*){6}([A-D]|\s)$

Ответ 3

Прочитав все ответы здесь, я решил, что нет четкого ответа на этот вопрос.

В моем регулярном выражении вам нужно будет удалить все пробелы из строки, но на самом деле вы должны делать это в любом случае для проверки большинства данных. Это может быть легко достигнуто, вот несколько примеров.

PHP

preg_replace('/(\s+)|(-)/', '', $str)

Javascript

str.replace(/ /g,'')

Для проверки, основанной на советах правительства Великобритании (http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm), я построил следующее регулярное выражение.

/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i

Вот объяснение этого регулярного выражения

/                      # Wraps regex
^                      # Beginning of string
[A-CEGHJ-PR-TW-Z]{1}   # Match first letter, cannot be D, F, I, Q, U or V
[A-CEGHJ-NPR-TW-Z]{1}  # Match second letter, cannot be D, F, I, O, Q, U or V
[0-9]{6}               # Six digits
[A-D]{1}               # Match last letter can only be A, B, C or D
$                      # End of string
/i                     # Ending wrapper and i denotes can be upper or lower case

Вот несколько тестовых шаблонов, которые вы можете использовать

Pass

AA 11 22 33 A
BB 44 55 66 B
ZZ 67 89 00 C

Отказ

AA 11 22 33 E
DA 11 22 33 A
FA 11 22 33 A
AO 11 22 33 A

Поскольку мне нужно было продлить действие jQuery, чтобы добавить это новое национальное регулярное выражение для внутреннего страхования, я также включаю это, поскольку это может быть полезно для кого-то.

jQuery.validator.addMethod('nino', function(nino, element) {
            return this.optional(element) || nino.length >= 9 &&
                nino.replace(/ /g,'').match(/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i);
        }, 'Please specify a valid national insurance number');

Ответ 4

Я думаю, что лучше сначала нормализовать его (удалить все символы пробела: \s regex заменить пустой строкой), а затем подтвердить.

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$

Ответ 5

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

[А-CEGHJ-NOPR-TW-Z] {2} [0-9] {6} [ABCD\с] {1}

Я провел некоторое тестирование онлайн-трансляции и, кажется, хорошо работает и всего за 4 шага.

https://web.archive.org/web/20121026141031/http://webarchive.nationalarchives.gov.uk/+/http://www.cabinetoffice.gov.uk/media/291296/CitizenIdentificationTypes-v1-4.xml

Ответ 6

[RegularExpression(@"^([ACEHJLMOPRSWXYacehjlmoprswxy][A-CEGHJ-NPR-TW-Za-ceghj-npr-tw-z]|Bb[A-CEHJ-NPR-TW-Za-cehj-npr-tw-z]|Gg[ACEGHJ-NPR-TW-Zaceghj-npr-tw-z]|[KTkt][A-CEGHJ-MPR-TW-Za-ceghj-mpr-tw-z]|Nn[A-CEGHJL-NPR-SW-Za-ceghjl-npr-sw-z]|Zz[A-CEGHJ-NPR-TW-Ya-ceghj-npr-tw-y])[0-9]{6}[A-Da-d ]$", ErrorMessage = "NI Number must be in the correct format.")]
  • NB/Это позволит пользователям вводить значения в нижнем регистре, поскольку у вас может быть стиль в текстовом поле, чтобы преобразовать нижний регистр в верхний регистр, и в этом случае вы можете захотеть, чтобы ваше регулярное выражение для номера NI также разрешало использовать нижний регистр.

Ответ 7

Существует фиксированный формат для номера национального страхования или NINO.

Формат числа - две буквы префикса, шесть цифр и одна буква суффикса.

Ни одна из первых двух букв не может быть D, F, I, Q, U или V. Вторая буква также не может быть O. Префиксы BG, GB, NK, KN, TN, NT и ZZ не выделяются.

После двух букв префикса шесть цифр выдаются последовательно от 00 00 00 до 99 99 99. Последние две цифры определяют день недели, в который выплачиваются различные пособия по социальному обеспечению, и когда безработным заявителям необходимо посещать свой Центр занятости, чтобы подписать на.

Буква суффикса - A, B, C или D.

В качестве примера обычно используется AB123456C. Часто число печатается с пробелами для парных цифр, например: AB 12 34 56 C.

Итак, регулярное выражение будет,

[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s?[0-9]{2}\s?[A-DFMP ]