我想接受的社会安全号码是:
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
答案 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提供了更完整的验证规则。在链接消失的情况下复制此处的信息,但也可以在代码项目上进行扩展。
社会安全号码不能:
从引用的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以下规则
666,000,900,999,123456789,111111111,222222222,333333333,444444444,555555555,666666666,777777777,888888888,999999999
排除结束字符0000
^(?!123([ -]?)45([ -]?)6789)(?!\b(\d)\3+\b)(?!000|666|900|999)[0-9]{3}([ -]?)(?!00)[0-9]{2}\4(?!0000)[0-9]{4}$
解释
^ - 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