regex 用于验证英国国民保险号码的正则表达式

vi4fp9gy  于 2023-08-08  发布在  其他
关注(0)|答案(9)|浏览(169)

我有下面的正则表达式来验证英国国民保险号码

^([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中可以这样做吗?先谢谢你了。

guz6ccqo

guz6ccqo1#

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

字符串

ghhaqwfi

ghhaqwfi2#

编辑:Andrew Bauer修改了我的答案,添加了对允许/不允许的字符的检查,这些字符在我回答时是未知的。你应该给他的答案投赞成票,因为它更完整,显然执行更好的验证。

如果你不能先删除所有的空格,这应该可以工作:

^\s*[a-zA-Z]{2}(?:\s*\d\s*){6}[a-dA-D]{1}?\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


更新:根据HMRC网站,最终字母将始终是A,B,C或D,最多只能有1个字母。#referance

goucqfw6

goucqfw63#

在阅读了所有的答案后,我确定这个问题没有一个明确的答案。
在我的正则表达式中,你需要去掉字符串中的所有空格,但实际上你应该这样做,以验证大多数数据。这可以很容易地实现这里有几个例子。
PHP语言
第一个月
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 validate来添加这个新的国家保险号码regex,我也包括了这个,因为它可能对某些人有用。

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

slmsl1lt

slmsl1lt4#

我认为最好先将其规范化(删除所有空格字符:\s regex替换为空字符串),然后进行验证。

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

字符串

qf9go6mv

qf9go6mv5#

我找到了一个指向政府XML文档的链接,该文档包含用于验证国民保险的正则表达式:
[A-CEGHJ-NOPR-TW-Z]{2}[0-9]{6}[ABCD\s]{1}
我在网上做了一些正则表达式的测试,似乎工作得很好,只有4个步骤。
https://web.archive.org/web/20121026141031/http://webarchive.nationalarchives.gov.uk/+/http://www.cabinetoffice.gov.uk/media/291296/CitizenIdentificationTypes-v1-4.xml

vuktfyat

vuktfyat6#

有一个固定的格式为国家保险号码或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 ]

字符串

zu0ti5jz

zu0ti5jz7#

试着清理一下,你可以用这个得到完整的验证:

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

/^(?!BG|GB|NK|KN|TN|NT|ZZ)(?![DFIQU])[A-Z](?![DFIOQU])[A-Z](?:\s?\d){6}\s?[A-D]$/i

字符串
基本上被分解了

/                            //start of match
^                            //From start of string
(?!BG|GB|NK|KN|TN|NT|ZZ)     //exclude any starting with any of these combinations
[A-CEGHJ-PR-TW-Z]            //first letter not DFIQU
or (?![DFIQU])[A-Z])        
[A-CEGHJ-NPR-TW-Z]           //second letter not DFIOQU
or (?!=[DFIOQU])[A-Z])
(?:\s?\d){6}                 //six digits (0-9) optionally preceded by a space (non-caputuring)
\s?[A-D]                     //last letter A,B,C or D optionally preceded by a space
/                            //end of match 
i                            //options i - Case Insensitive


根据Regex101,PCRE2需要34或38个步骤,第二个步骤更慢,但更容易阅读。
两者都适合字母组和数字组之间的空格
都允许大写或小写

hwamh0ep

hwamh0ep8#

[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.")]

字符串

  • N.B/这将允许用户输入小写值,因为您的文本框上可能有一个将小写转换为大写的样式,在这种情况下,您可能希望NI Number的正则表达式也允许小写。
toe95027

toe950279#

  • 我在找正则表达式的时候发现了这个。所以我想分享一下这个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个字符。
  • 前两个字符必须是字母。
  • 接下来的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等)

相关问题