25

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

^([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中做到吗?先感谢您。

4

9 回答 9

61

实际上,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)$
于 2013-07-22T03:33:54.837 回答
34

编辑: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
于 2012-04-18T07:11:44.153 回答
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 validate 以添加这个新的国家保险号码正则表达式,因此我也将其包括在内,因为它可能对某人有用。

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');
于 2015-12-03T13:39:50.280 回答
5

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

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$
于 2012-04-18T07:04:07.940 回答
2

我找到了一个指向政府 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

于 2017-01-13T11:12:31.190 回答
1

国民保险号或 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 ]
于 2019-05-23T06:38:55.780 回答
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.")]
  • 注意/这将允许用户输入小写值,因为您可能在文本框上有一种将小写转换为大写的样式,在这种情况下,您可能希望 NI 编号的正则表达式也允许小写。
于 2018-03-15T09:40:48.563 回答
0
  • 当我四处寻找合适的正则表达式时才发现这个。所以只想分享这个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 个字符。
  • 前 2 个字符必须是字母。
  • 接下来的 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 等)
于 2020-10-06T16:31:55.767 回答
0

尝试了一下清理它,您可以通过以下方式获得完整的验证:

/^(?!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 步执行,第二步较慢,但更易于阅读。

都满足字母组和数字之间的空间

都允许大写或小写

于 2021-11-05T17:45:51.870 回答