外面有人知道如何改善此功能吗?我不担心缩短代码,我相信可以用更好的正则表达式来完成,我更关心正确的逻辑。我花了很长时间才找到SSN#的文档。我在下面使用的大多数规则来自信贷行业的其他程序员(未引用任何消息)。
您是否知道其他规则?
你知道这是否有错吗?
您可以找到您的资源吗?
public static bool isSSN(string ssn) { Regex rxBadSSN = new Regex(@"(\d)\1\1\1\1\1\1\1\1"); //Must be 9 bytes if(ssn.Trim().Length != 9) return false; //Must be numeric if(!isNumeric(ssn)) return false; //Must be less than 772999999 if( (Int32)Double.Parse(ssn.Substring(0,3)) > 772 ) { //Check for Green Card Temp SSN holders // Could be 900700000 // 900800000 if(ssn.Substring(0,1) != "9") return false; if(ssn.Substring(3,1) != "7" && ssn.Substring(3,1) != "8") return false; } //Obviously Fake! if(ssn == "123456789") return false; //Try again! if(ssn == "123121234") return false; //No single group can have all zeros if(ssn.Substring(0,3) == "000") return false; if(ssn.Substring(3,2) == "00") return false; if(ssn.Substring(5,4) == "0000") return false; //Check to make sure the SSN number is not repeating if (rxBadSSN.IsMatch(ssn)) return false; return true; }
更新
2011年6月25日,SSA将SSN分配过程更改为“ SSN随机化”。[27] SSN随机化通过以下方式影响SSN分配过程:
通过不再分配用于分配给特定状态下的个人的区域号,它消除了SSN的前三位数字的地理重要性(以前称为区域号)。它消除了最高组号的重要性,因此,高组列表被及时冻结,可用于验证在随机实施日期之前发布的SSN。以前未分配的区号已引入分配中,但区号000、666和900-999除外。
新规则
http://en.wikipedia.org/wiki/Social_Security_number#Structure
上一个答案
这是我发现的SSN组成的最完整描述。