Regex 验证英国国民保险号的正则表达式

Regex 验证英国国民保险号的正则表达式,regex,validation,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)

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

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

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

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

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


如果您不能先删除所有空白,那么这应该可以:

^\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

实际上,NIN不允许前两个字母为D、F、I、Q、U或V,第二个字母为O;除此之外,前缀字母不能是BG、GB、NK、KN、TN、NT和ZZ。后缀字母也可以是A、B、C或D,但如果未知,可以用空格表示。-

因此,更有效的支票应该是(我只提供了一个大写字母的版本,可以很容易地更改为小写):


在阅读了这里的所有答案后,我确定这个问题没有一个明确的答案

使用我的正则表达式,您需要去掉字符串中的所有空格,但实际上,您无论如何都应该这样做,以验证大多数数据。这很容易实现,这里有几个例子

PHP

preg_replace('/(\s+)(-)/,''$str)

Javascript

str.replace(//g',)

对于基于英国政府建议()的验证,我构建了以下正则表达式

/^[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
由于我需要扩展jqueryvalidate来添加这个新的国家保险号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');

我找到了一个指向政府xml文档的链接,该文档包含用于验证国民保险的正则表达式,它是:

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

我在regex online上做了一些测试,似乎工作得很好,只需4个步骤

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

    • 国民保险号码或尼诺有固定格式

      数字的格式为两个前缀字母、六位数字和一个后缀字母

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

      在两个前缀字母之后,从00到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 ]
      
      • 我在找一个合适的正则表达式的时候发现了这个。所以我想分享一下
      • 在引擎盖下,他们使用以下正则表达式
        “(^(?!BG)(!GB)(!NK)(!KN)(!TN)(!NT)(!ZZ)[A-Z和[^DFIQUV]][A-Z和[^DFIQUV][0-9]{6}[A-D]$”
      • 我发现这非常有用,正如预期的那样,maven的旧版本也支持以空格结尾的NINO
      • 列表项
      Nino验证程序符合以下所有标准。

      • 必须是9个字符
      • 前2个字符必须是alpha
      • 接下来的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等)

      谢谢,也谢谢附带的解释,前面加了
      (?i)
      。在测试中,正则表达式与示例匹配,直到您在NI编号的末尾加上空格。这是最完整的答案。它迎合了有效前缀和无效前缀以及结尾的空格。您在这里给出了一个糟糕的示例,它导致了这个问题的一些答案(包括公认的答案)是错误的。您的示例NI号码以QQ开头。字母Q在NI编号中的任何位置无效。请参阅Andrew Bauer的答案,其中详细说明了所涉及的验证规则。
      {1}
      不是必需的,因为它是隐含的!然而,如果下一个人不知道这是隐含的,它会为他们提供更清晰、更可读的代码。我们应该一直寻找编写易于阅读的代码。这个正则表达式缺少不允许的前缀(BG,GB,NK,KN,TN,NT,ZZ)我无法让这个正则表达式工作这里是我登陆的“^(?!BG)(!GB)(!NK)(!KN)(!TN)(!NT)(!TN)(!NT)(!ZZ)[A-Z]*[^DFIQUV][A-Z]*[^DFIOQUV 0-9]{6}[A-D]$”使用
      [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.")]
      
      [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 ]