接受虚线,空格或无空间的社会安全号码验证

wir*_*iko 4 regex

我想接受的社会安全号码是:

xxx-xx-xxxx (ex. 123-45-6789)
xxxxxxxxx (ex. 123456789)
xxx xx xxxx (ex. 123 45 6789)
Run Code Online (Sandbox Code Playgroud)

我不是正则表达式专家,但我写了这个(它有点难看)

^(\d{3}-\d{2}-\d{4})|(\d{3}\d{2}\d{4})|(\d{3}\s{1}\d{2}\s{1}\d{4})$
Run Code Online (Sandbox Code Playgroud)

然而,当它实际上应该失败时,这个社会安全号码会通过,因为只有一个空格

12345 6789
Run Code Online (Sandbox Code Playgroud)

所以我需要一个更新的正则表达式,拒绝像这样的东西

12345 6789
123 456789
Run Code Online (Sandbox Code Playgroud)

为了使事情变得更复杂,似乎SSN不能以000或666开始并且可以达到899,第二和第三组数字也不能全部为0.

我想出了这个

^(?!000|666)[0-8][0-9]{2}[ \-](?!00)[0-9]{2}[ \-](?!0000)[0-9]{4}$
Run Code Online (Sandbox Code Playgroud)

哪个用空格或破折号验证,但如果数字是这样的话,它就会失败

123456789
Run Code Online (Sandbox Code Playgroud)

理想情况下,这些SSN应该通过

123456789
123 45 6789
123-45-6789
899-45-6789
001-23-4567
Run Code Online (Sandbox Code Playgroud)

这些都应该失败

12345 6789
123 456789
123x45x6789
ABCDEEEEE
1234567890123
000-45-6789
123-00-6789
123-45-0000
666-45-6789
Run Code Online (Sandbox Code Playgroud)

Szy*_*mon 6

要解决破折号,空格等一致的问题,可以使用反向引用.使第一个分隔符成为一个组并允许它是可选的 - ([ \-]?).然后,您可以引用它\1以确保第二个分隔符与第一个分隔符相同:

^(?!000|666)[0-9]{3}([ -]?)(?!00)[0-9]{2}\1(?!0000)[0-9]{4}$
Run Code Online (Sandbox Code Playgroud)

看到这里(感谢@Tushar)

  • [`^(?!000|666)[0-9]{3}([-]?)(?!00)[0-9]{2}\1(?!0000)[0-9]{ 4}$`](https://regex101.com/r/rA2xA2/1) (3认同)

Geo*_*rge 6

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}$
Run Code Online (Sandbox Code Playgroud)

与空格相同,而不是破折号

^(?!219 09 9999|078 05 1120)(?!666|000|9\d{2})\d{3} (?!00)\d{2} (?!0{4})\d{4}$
Run Code Online (Sandbox Code Playgroud)

最后,这将验证没有空格或破折号的数字

^(?!219099999|078051120)(?!666|000|9\d{2})\d{3}(?!00)\d{2}(?!0{4})\d{4}$
Run Code Online (Sandbox Code Playgroud)

结合上述三种情况,我们得到了

回答

^((?!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})$
Run Code Online (Sandbox Code Playgroud)