SSN和9号码筛选问题

时间:2018-04-24 12:32:40

标签: regex

此正则表达式正在寻找多种格式的社会安全号码(SSN),但它也忽略了明显无效的SSN,如123-45-6789或000-00-0000等。

此表达式应找到以下社会安全号码:

  • 包含任何非数字分隔符(即###-##-#######.##.####### ### ####
  • 它还应该捕获9位数字 序列没有分隔符,但以空格为边界(即`文本 ### text , or ### ######### ###`)
  • 此表达式将忽略以下社会安全号码:包含任何特定组中的所有零(即000-##-#######-00-#######-##-0000
  • 666
  • 开始
  • 900-999
  • 开始使用任何值
  • 等于078-05-1120(由于Woolworth&#Wallet Fiasco)
  • 等于219-09-9999(出现在社会保障广告中 给药)
  • 包含所有匹配的值(即000-00-0000111-11-1111222-22-2222等。)
  • 包含所有递增值(即123-45-6789

正则表达式

(@"(?!\b(\d)\1+\D?(\d)\1+\D?(\d)\1+\b)(?!123\D?45\D?6789|219\D?09\D?9999|078\D?05\D?1120)(?!666|000|9\d{2})(?<!\d)\d{3}\D?(?!00)\d{2}\D?(?!0{4})\d{4}(?!\d)(?<!\d{5}-\d{4})",

问题是我们捕获的其他条目类似于那些但我们需要足够具体,这些条目都没有被抓住。

如 -

 (xxxx) xxx-xx-xxxx

 684072943 (and order number etc.)

 FA300217F0090

 Potential Match #1:--------------- nt: ex: 201[[71230 0821]] am ex: 201[[71230 0821]] am 26 JUNE 2012 ---------------Potential Match #2:--------------- am ex: 201[[71230 0821]] am 26 JUNE 2012 DTG (date time group) 

"[[ 210v13:2012]],"

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用\D?匹配任何非数字作为分隔符。这将是一个更简化的SSN验证器:

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

这篇文章可能会有帮助:http://rion.io/2013/09/10/validating-social-security-numbers-through-regular-expressions-2/

该文章还提供了一个更加过分的解决方案,可能正是您所寻找的:

^(?!\b(\d)1+\D?(\d)1+\D?(\d)1+\b)(?!123\D?45\D?6789|219\D?09\D?9999|078\D?05\D?1120)(?!666|000|9d{2})\d{3}\D?(?!00)\d{2}\D?(?!0{4})\d{4}$