我有以下正则表达式,用于验证英国国民保险号码
^([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)
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)
在阅读了所有答案之后,我已经确定这个问题没有明确的答案.
使用我的正则表达式,您将需要从字符串中删除所有空格,但实际上您应该这样做以验证大多数数据.这可以很容易地实现,这里有几个例子.
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)
我认为最好先对其进行规范化(删除所有空白字符:\s正则表达式以替换为空字符串),然后进行验证。
^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$
Run Code Online (Sandbox Code Playgroud)