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

Ish*_*han 19 regex validation

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

^([a-zA-Z]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([a-zA-Z]){1}?$
Run Code Online (Sandbox Code Playgroud)

可接受的值是:

AB 12 34 56 A

AB123456A
Run Code Online (Sandbox Code Playgroud)

我希望这个值也被接受.有人可以帮我解决这个问题吗?

AB 123456 A

AB 123 456 A

AB 1 2345 6 A

    AB   12   34   56 A    (multiple space anywhere)
Run Code Online (Sandbox Code Playgroud)

即使字符串中有额外的空格或没有空格,RE也应该有效.这可以在RE中做到吗?先感谢您.

小智 46

实际上,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)$
Run Code Online (Sandbox Code Playgroud)

  • 前缀为`(?i)`[应允许不区分大小写的匹配](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#special). (2认同)

ala*_*lan 33

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


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

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

说明:

^                 # 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
Run Code Online (Sandbox Code Playgroud)


Phi*_*ook 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
Run Code Online (Sandbox Code Playgroud)

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

通过

AA 11 22 33 A
BB 44 55 66 B
ZZ 67 89 00 C
Run Code Online (Sandbox Code Playgroud)

失败

AA 11 22 33 E
DA 11 22 33 A
FA 11 22 33 A
AO 11 22 33 A
Run Code Online (Sandbox Code Playgroud)

因为我需要扩展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');
Run Code Online (Sandbox Code Playgroud)


Art*_*lev 5

我认为最好先对其进行规范化(删除所有空白字符:\s正则表达式以替换为空字符串),然后进行验证。

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$
Run Code Online (Sandbox Code Playgroud)