正则表达式以验证英国国民保险号码

时间:2012-04-18 06:56:00

标签: regex validation

我有以下正则表达式,用于验证英国国民保险号

^([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中做到吗?提前谢谢。

8 个答案:

答案 0 :(得分:45)

实际上,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)$

答案 1 :(得分:31)

编辑:安德鲁鲍尔修改了我的答案,为我回答时未知的允许/不允许字符添加检查。你应该对他的答案进行投票,因为它更完整,显然可以更好地进行验证。


如果你不能先删除所有空格,那么这应该有效:

^\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 :(得分:6)

在阅读完所有答案后,我确定这个问题没有明确的答案。

使用我的正则表达式,您将需要从字符串中删除所有空格,但实际上您应该这样做以验证大多数数据。这可以很容易地实现,这里有几个例子。

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

以下是您可以使用的一些测试模式

<强>通

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');

答案 3 :(得分:3)

我认为最好先将其标准化(删除所有空白字符:\s正则表达式替换为空字符串),然后验证。

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

答案 4 :(得分:2)

我找到了政府xml文档的链接,其中包含用于验证国家保险的正则表达式:

[A-CEGHJ-NOPR-TW-Z] {2} [0-9] {6} [ABCD \ s]的{1}

我已经在网上对regex进行了一些测试,似乎运行良好,只需4步。

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

答案 5 :(得分:0)

[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编号的正则表达式允许小写。< / LI>

答案 6 :(得分:0)

国家保险号码或NINO有固定的格式。

数字格式为两个前缀字母,六个数字和一个后缀字母。

前两个字母都不能为D,F,I,Q,U或V。第二个字母也不能为O。未分配前缀BG,GB,NK,KN,TN,NT和ZZ。

在两个前缀字母之后,从00 00 00到99 99 99依次发布六个数字。最后两个数字确定一周中的哪一天支付各种社会保障福利,以及何时失业的申领者需要参加该活动。 Jobcentre登录。

后缀字母是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 ]

答案 7 :(得分:0)

  • 当我四处寻找合适的正则表达式时,就发现了这一点。因此,只需考虑共享此DWP NINO format-validation
  • 内幕下,他们正在使用以下正则表达式 "(^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)[A-Z&&[^DFIQUV]][A-Z&&[^DFIOQUV]][0-9]{6}[A-D ]$)"
  • 我发现这非常有用,并且可以正常工作,而较早版本的maven也支持NINO,结尾字符为空格。
  • 列表项

Nino Validator满足以下所有条件。

  • 必须为9个字符。
  • 前2个字符必须为字母。
  • 接下来的6个字符必须是数字。
  • 最后一个字符可以是A,B,C,D或空格。
  • 第一个字符不能为D,F,I,Q,U或V。
  • 第二个字符不得为D,F,I,O,Q,U或V。
  • 前2个字符不能为GB,NK,TN或ZZ的组合(术语组合涵盖GB和BG等。)