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

时间:2015-12-30 05:08:34

标签: regex

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

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

3 个答案:

答案 0 :(得分:6)

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

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

here(感谢@Tushar)

答案 1 :(得分:6)

http://www.codeproject.com/Articles/651609/Validating-Social-Security-Numbers-through-Regular上的CodeProject提供了更完整的验证规则。在链接消失的情况下复制此处的信息,但也可以在代码项目上进行扩展。

社会安全号码不能:

  • 包含任何特定组中的所有零(即000 - ## - ####,### - 00 - ####,或### - ## - 0000)
  • 以'666'开头。
  • 从'900-999'
  • 开始
  • Be'078-05-1120'(由于Woolworth的钱包Fiasco)
  • Be'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})$

答案 2 :(得分:0)

我要求验证SSN。此正则表达式将验证SSN以下规则

  1. 匹配短划线,空格或无空格
  2. 数字,9位数字,非字母数字
  3. 排除所有零
  4. 排除开头字符666,000,900,999,123456789,111111111,222222222,333333333,444444444,555555555,666666666,777777777,888888888,999999999
  5. 排除结束字符0000

    ^(?!123([ -]?)45([ -]?)6789)(?!\b(\d)\3+\b)(?!000|666|900|999)[0-9]{3}([ -]?)(?!00)[0-9]{2}\4(?!0000)[0-9]{4}$
    
  6. 解释

         ^ - Beginning of string  
        (?!123([ -]?)45([ -]?)6789) - Don't match 123456789, 123-45-6789, 123 45 6789  
        (?!\b(\d)\3+\b) - Don't match 00000000,111111111...999999999. Repeat same with space and dashes. '\3' is for backtracking to (\d)  
        (?!000|666|900|999) - Don't match SSN that begins with 000,666,900 or 999.
        ([ -]?) - Check for space and dash. '?' is used to make space and dash optional. ? is 0 or 1 occurence of previous character.
        (?!00) - the 4th and 5th characters cannot be 00.
        \4 - Backtracking to check for space and dash again after the 5th character. 
        (?!0000) - The last 4 characters cannot be all zeros.
        $ - End of string
        Backtracking is used to repeat a captured group (). Each group is represented sequentially 1,2,3..so on
    

    有关更多说明和示例,请参见此处 https://regex101.com/r/rA2xA2/3