我想接受的社会安全号码是:
xxx-xx-xxxx (ex. 123-45-6789) xxxxxxxxx (ex. 123456789) xxx xx xxxx (ex. 123 45 6789)
我不是正则表达式专家,但我写了这个(它有点难看)
^(\d{3}-\d{2}-\d{4})|(\d{3}\d{2}\d{4})|(\d{3}\s{1}\d{2}\s{1}\d{4})$
然而,当它实际上应该失败时,这个社会安全号码会通过,因为只有一个空格
12345 6789
所以我需要一个更新的正则表达式,拒绝像这样的东西
12345 6789 123 456789
为了使事情变得更复杂,似乎SSN不能以000或666开始并且可以达到899,第二和第三组数字也不能全部为0.
我想出了这个
^(?!000|666)[0-8][0-9]{2}[ \-](?!00)[0-9]{2}[ \-](?!0000)[0-9]{4}$
哪个用空格或破折号验证,但如果数字是这样的话,它就会失败
123456789
理想情况下,这些SSN应该通过
123456789 123 45 6789 123-45-6789 899-45-6789 001-23-4567
这些都应该失败
12345 6789 123 456789 123x45x6789 ABCDEEEEE 1234567890123 000-45-6789 123-00-6789 123-45-0000 666-45-6789
Szymon.. 6
要解决破折号,空格等一致的问题,可以使用反向引用.使第一个分隔符成为一个组并允许它是可选的 - ([ \-]?)
.然后,您可以引用它\1
以确保第二个分隔符与第一个分隔符相同:
^(?!000|666)[0-9]{3}([ -]?)(?!00)[0-9]{2}\1(?!0000)[0-9]{4}$
看到这里(感谢@Tushar)
要解决破折号,空格等一致的问题,可以使用反向引用.使第一个分隔符成为一个组并允许它是可选的 - ([ \-]?)
.然后,您可以引用它\1
以确保第二个分隔符与第一个分隔符相同:
^(?!000|666)[0-9]{3}([ -]?)(?!00)[0-9]{2}\1(?!0000)[0-9]{4}$
看到这里(感谢@Tushar)
CodeProject上提供了更完整的验证规则,网址为http://www.codeproject.com/Articles/651609/Validating-Social-Security-Numbers-through-Regular.在链接消失的情况下复制此处的信息,还要扩展代码项目的答案.
社会安全号码不能:
包含任何特定组中的所有零(即000 - ## - ####,### - 00 - ####,或### - ## - 0000)
从'666'开始.
从'900-999'的任何值开始
'078-05-1120'(由于Woolworth的钱包Fiasco)
是'219-09-9999'(出现在社会保障局的广告中)
从引用的CodeProject文章中获取的RegEx将根据所有规则验证所有社会安全号码 - 需要破折号作为分隔符.
^(?!219-09-9999|078-05-1120)(?!666|000|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4}$
与空格相同,而不是破折号
^(?!219 09 9999|078 05 1120)(?!666|000|9\d{2})\d{3} (?!00)\d{2} (?!0{4})\d{4}$
最后,这将验证没有空格或破折号的数字
^(?!219099999|078051120)(?!666|000|9\d{2})\d{3}(?!00)\d{2}(?!0{4})\d{4}$
结合上述三种情况,我们得到了
^((?!219-09-9999|078-05-1120)(?!666|000|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4})|((?!219 09 9999|078 05 1120)(?!666|000|9\d{2})\d{3} (?!00)\d{2} (?!0{4})\d{4})|((?!219099999|078051120)(?!666|000|9\d{2})\d{3}(?!00)\d{2}(?!0{4})\d{4})$