正則は2世代の身分証明書番号の検証の詳細を実現する


最近、プロジェクトは身分証明書を合理的にフィルタリングする必要があり、サードパーティインタフェースを使用したくないので、方法を書きました.
身分証明書番号の合法性検証をサポートし、18ビットの身分証明書番号をサポートし、住所コード、生年月日、検査ビット検証をサポートする.基本的にはこれでいいです.
IdCodeValid:function(code){
	//         
	//  15  18     
	//      、    、     
	var city={11:"  ",12:"  ",13:"  ",14:"  ",15:"   ",21:"  ",22:"  ",23:"    ",31:"  ",32:"  ",33:"  ",34:"  ",35:"  ",36:"  ",37:"  ",41:"  ",42:"   ",43:"  ",44:"  ",45:"  ",46:"  ",50:"  ",51:"  ",52:"  ",53:"  ",54:"   ",61:"  ",62:"  ",63:"  ",64:"  ",65:"  ",71:"  ",81:"  ",82:"  ",91:"   "};
	var row={
		'pass':true,
		'msg':'    '
	};
	if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/.test(code)){
		row={
			'pass':false,
			'msg':'        '
		};
	}else if(!city[code.substr(0,2)]){
		row={
			'pass':false,
			'msg':'          '
		};
	}else{
		//18               
		if(code.length == 18){
			code = code.split('');
			//∑(ai×Wi)(mod 11)
			//    
			var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
			//   
			var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
			var sum = 0;
			var ai = 0;
			var wi = 0;
			for (var i = 0; i < 17; i++)
			{
				ai = code[i];
				wi = factor[i];
				sum += ai * wi;
			}
			if(parity[sum % 11] != code[17].toUpperCase()){
				row={
					'pass':false,
					'msg':'         '
				};
			}
		}
	}
	return row;
}

IdCodeValid('xxx');

 
正規表現:生年月日1800-2099(18|19|20)?d{2}(0[1-9]|1[02])(0[1-9]|[12]d|3[01])身分証明書正規表現/^d{6}(18|19|20)?d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])d{3}(d|[xX])$/ビット検証ルール6ビットアドレス符号化+8ビット生年月日+3ビット順序番号+1ビット検証ビット