我有以下正则表达式,用于验证英国国民保险号
^([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中做到吗?提前谢谢。
答案 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步。
答案 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.")]
答案 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)
"(^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)[A-Z&&[^DFIQUV]][A-Z&&[^DFIOQUV]][0-9]{6}[A-D ]$)"
Nino Validator满足以下所有条件。