java代码验证各地区身份证规则

[java] view plain copy print ?
  1. package com.nebula;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. public class CheckIdCard {  
  7.   
  8.       
  9.     public static final String ACCEPT = ""// 检查通过是返回的的成功标识字符串  
  10.       
  11.     public static final int EIGHTEEN_IDCARD = 18;   //标识18位身份证号码  
  12.     public static final int FIFTEEN_IDCARD = 15;    //标识15位身份证号码  
  13.       
  14.     public static final int MAX_MAINLAND_AREACODE = 659004//大陆地区地域编码最大值  
  15.     public static final int MIN_MAINLAND_AREACODE = 110000//大陆地区地域编码最小值  
  16.     public static final int HONGKONG_AREACODE = 810000//香港地域编码值  
  17.     public static final int TAIWAN_AREACODE = 710000;   //台湾地域编码值  
  18.     public static final int MACAO_AREACODE = 820000;    //澳门地域编码值  
  19.       
  20.     private static final int MAN_SEX = 1;   //标识男性  
  21.     private static final int WOMAN_SEX = 2//标识女性  
  22.       
  23.     //储存18位身份证校验码   
  24.     private static final String[] SORTCODES = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};  
  25.     /** 
  26.      * @param args 
  27.      */  
  28.     public static void main(String[] args) {  
  29.         // TODO Auto-generated method stub  
  30.         String idCard = "142424870329324";  
  31.         String result = chekIdCard(1,idCard);  
  32.         if"".equals(result) )  
  33.             System.out.println("身份证合法");  
  34.         else   
  35.             System.out.println(result);  
  36.     }  
  37.       
  38.       
  39.     /** 
  40.      * 验证身份证主方法 
  41.      */  
  42.     public static String chekIdCard( int sex,String idCardInput ){  
  43.         if( idCardInput == null || "".equals(idCardInput))  
  44.             return "身份证号码为必填";  
  45.         if( idCardInput.length() != 18 && idCardInput.length() !=15 )  
  46.             return "身份证号码位数不符";  
  47.         if( idCardInput.length() == 15)  
  48.             return checkIdCard15(sex,idCardInput);  
  49.         else  
  50.             return checkIdCard18(sex,idCardInput);  
  51.     }  
  52.       
  53.     /** 
  54.      * 验证15位身份证号码 
  55.      */  
  56.     private static String checkIdCard15( int sex,String idCardInput ){  
  57.         String numberResult = checkNumber(FIFTEEN_IDCARD,idCardInput);  
  58.         if( !ACCEPT.equals(numberResult))  
  59.             return numberResult;  
  60.           
  61.         String areaResult = checkArea(idCardInput);  
  62.         if( !ACCEPT.equals(areaResult))  
  63.             return areaResult;  
  64.           
  65.         String birthResult = checkBirthDate( FIFTEEN_IDCARD, idCardInput);  
  66.         if( !ACCEPT.equals(birthResult))  
  67.             return birthResult;  
  68.           
  69.         String sortCodeResult = checkSortCode(FIFTEEN_IDCARD,sex,idCardInput);  
  70.         if( !ACCEPT.equals(sortCodeResult))  
  71.             return sortCodeResult;  
  72.           
  73.         String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD,idCardInput);  
  74.         if( !ACCEPT.equals(checkCodeResult))  
  75.             return checkCodeResult;  
  76.           
  77.         return ACCEPT;  
  78.     }  
  79.       
  80.     /** 
  81.      * 验证18位身份证号码 
  82.      */  
  83.     private static String checkIdCard18( int sex, String idCardInput ){  
  84.           
  85.         String numberResult = checkNumber(EIGHTEEN_IDCARD,idCardInput);  
  86.         if( !ACCEPT.equals(numberResult))  
  87.             return numberResult;  
  88.           
  89.         String areaResult = checkArea(idCardInput);  
  90.         if( !ACCEPT.equals(areaResult))  
  91.             return areaResult;  
  92.           
  93.         String birthResult = checkBirthDate( EIGHTEEN_IDCARD, idCardInput);  
  94.         if( !ACCEPT.equals(birthResult))  
  95.             return birthResult;  
  96.   
  97.         String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD,sex,idCardInput);  
  98.         if( !ACCEPT.equals(sortCodeResult))  
  99.             return sortCodeResult;  
  100.           
  101.         String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD,idCardInput);  
  102.         if( !ACCEPT.equals(checkCodeResult))  
  103.             return checkCodeResult;  
  104.           
  105.         return ACCEPT;  
  106.     }  
  107.       
  108.     /** 
  109.      * 验证身份证的地域编码是符合规则 
  110.      */  
  111.     private static String checkArea( String idCardInput ){  
  112.         String subStr = idCardInput.substring(06);  
  113.         int areaCode = Integer.parseInt(subStr);  
  114.         if( areaCode != HONGKONG_AREACODE && areaCode != TAIWAN_AREACODE  
  115.                 && areaCode != MACAO_AREACODE   
  116.                 && ( areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE) )  
  117.             return "输入的身份证号码地域编码不符合大陆和港澳台规则";  
  118.         return ACCEPT;  
  119.     }  
  120.       
  121.     /** 
  122.      * 验证身份证号码数字字母组成是否符合规则 
  123.      */  
  124.     private static String checkNumber( int idCardType ,String idCard ){  
  125.         char[] chars = idCard.toCharArray();  
  126.         if( idCardType == FIFTEEN_IDCARD ){  
  127.             forint i = 0; i
  128.                 if( chars[i] > '9' )  
  129.                     return idCardType+"位身份证号码中不能出现字母";  
  130.             }  
  131.         } else {  
  132.             forint i = 0; i < chars.length; i++ ) {  
  133.                 if( i < chars.length-1 ){  
  134.                     if( chars[i] > '9' )  
  135.                         return EIGHTEEN_IDCARD+"位身份证号码中前"+(EIGHTEEN_IDCARD-1)+"不能出现字母";  
  136.                 } else {  
  137.                     if( chars[i] > '9' && chars[i] != 'X')  
  138.                         return idCardType+"位身份证号码中最后一位只能是数字0~9或字母X";  
  139.                 }  
  140.             }  
  141.               
  142.         }  
  143.               
  144.         return ACCEPT;  
  145.     }  
  146.       
  147.     /** 
  148.      * 验证身份证号码出生日期是否符合规则 
  149.      */  
  150.     private static String checkBirthDate(int idCardType, String idCardInput ){  
  151.         String yearResult = checkBirthYear(idCardType,idCardInput);  
  152.         if( !ACCEPT.equals(yearResult))  
  153.             return yearResult;  
  154.           
  155.         String monthResult = checkBirthMonth(idCardType,idCardInput);  
  156.         if( !ACCEPT.equals(monthResult))  
  157.             return monthResult;  
  158.           
  159.         String dayResult = checkBirthDay(idCardType,idCardInput);  
  160.         if( !ACCEPT.equals(dayResult))  
  161.             return dayResult;  
  162.   
  163.         return ACCEPT;  
  164.     }  
  165.       
  166.     /** 
  167.      * 验证身份证号码出生日期年份是否符合规则 
  168.      */  
  169.     private static String checkBirthYear(int idCardType, String idCardInput){  
  170.         if( idCardType == FIFTEEN_IDCARD){  
  171.             int year = Integer.parseInt(idCardInput.substring(68));  
  172.             if( year < 0 || year > 99 )  
  173.                 return idCardType+"位的身份证号码年份须在00~99内";  
  174.         } else {  
  175.             int year = Integer.parseInt(idCardInput.substring(610));  
  176.             int yearNow = getYear();  
  177.             if( year < 1900 || year > yearNow )  
  178.                 return idCardType+"位的身份证号码年份须在1900~"+yearNow+"内";  
  179.         }  
  180.         return ACCEPT;  
  181.     }  
  182.   
  183.     /** 
  184.      * 验证身份证号码出生日期月份是否符合规则 
  185.      */  
  186.     private static String checkBirthMonth(int idCardType, String idCardInput){  
  187.         int month = 0;  
  188.         if( idCardType == FIFTEEN_IDCARD)  
  189.             month = Integer.parseInt(idCardInput.substring(810));   
  190.         else   
  191.             month = Integer.parseInt(idCardInput.substring(1012));  
  192.           
  193.         if( month < 1 || month > 12)  
  194.             return "身份证号码月份须在01~12内";  
  195.               
  196.         return ACCEPT;  
  197.     }  
  198.       
  199.     /** 
  200.      * 验证身份证号码出生日期天数是否符合规则 
  201.      */  
  202.     private static String checkBirthDay(int idCardType, String idCardInput){  
  203.         boolean bissextile = false;   
  204.         int year,month,day;  
  205.         if( idCardType == FIFTEEN_IDCARD){  
  206.             year = Integer.parseInt("19"+idCardInput.substring(68));  
  207.             month = Integer.parseInt(idCardInput.substring(810));   
  208.             day = Integer.parseInt(idCardInput.substring(1012));  
  209.         } else {  
  210.             year = Integer.parseInt(idCardInput.substring(610));  
  211.             month = Integer.parseInt(idCardInput.substring(1012));  
  212.             day = Integer.parseInt(idCardInput.substring(1214));  
  213.         }  
  214.         if( year%4 == 0 && year%100 != 0 || year%400 ==0 )    
  215.             bissextile = true;  
  216.           
  217.         switch( month ){  
  218.         case 1:  
  219.         case 3:  
  220.         case 5:  
  221.         case 7:  
  222.         case 8:  
  223.         case 10:  
  224.         case 12:  
  225.             if( day < 1 || day > 31 )  
  226.                 return "身份证号码大月日期须在1~31之间";  
  227.                 break;  
  228.         case 4:  
  229.         case 6:  
  230.         case 9:  
  231.         case 11:  
  232.             if( day < 1 || day > 30 )  
  233.                 return "身份证号码小月日期须在1~30之间";  
  234.                 break;  
  235.         case 2:  
  236.             if(bissextile){  
  237.                 if( day < 1 || day > 29 )  
  238.                     return "身份证号码闰年2月日期须在1~29之间";  
  239.             }else {  
  240.                 if( day < 1 || day > 28 )  
  241.                     return "身份证号码非闰年2月日期年份须在1~28之间";  
  242.             }  
  243.             break;  
  244.         }  
  245.         return ACCEPT;  
  246.     }  
  247.       
  248.     /** 
  249.      * 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数 
  250.      */  
  251.     private static String checkSortCode(int idCardType ,int sex,String idCardInput){  
  252.         int sortCode = 0;  
  253.         if( idCardType == FIFTEEN_IDCARD ){  
  254.             sortCode = Integer.parseInt(idCardInput.substring(1215));  
  255.         } else {  
  256.             sortCode = Integer.parseInt(idCardInput.substring(1417));  
  257.         }  
  258.           
  259.         if( sex == MAN_SEX ){  
  260.             if( sortCode%2 == 0)  
  261.                 return "男性的身份证顺序码须为奇数";  
  262.         } else {  
  263.             if( sortCode%2 != 0)  
  264.                 return "女性的身份证顺序码须为偶数";       
  265.         }  
  266.           
  267.         return ACCEPT;  
  268.     }  
  269.       
  270.     /** 
  271.      * 验证18位身份证号码校验码是否符合规则 
  272.      */  
  273.     private static String checkCheckCode( int idCardType , String idCard ){  
  274.         if( idCardType == EIGHTEEN_IDCARD ){  
  275.             int sum = 0;  
  276.             char[] chars = idCard.toCharArray();  
  277.             forint i=0; i
  278.                 if( i==0 ) sum = sum+(chars[i]*7);  
  279.                 if( i==1 ) sum = sum+(chars[i]*9);  
  280.                 if( i==2 ) sum = sum+(chars[i]*10);  
  281.                 if( i==3 ) sum = sum+(chars[i]*5);  
  282.                 if( i==4 ) sum = sum+(chars[i]*5);  
  283.                 if( i==5 ) sum = sum+(chars[i]*8);  
  284.                 if( i==6 ) sum = sum+(chars[i]*4);  
  285.                 if( i==7 ) sum = sum+(chars[i]*1);  
  286.                 if( i==8 ) sum = sum+(chars[i]*6);  
  287.                 if( i==9 ) sum = sum+(chars[i]*3);  
  288.                 if( i==10 ) sum = sum+(chars[i]*7);  
  289.                 if( i==11 ) sum = sum+(chars[i]*9);  
  290.                 if( i==12 ) sum = sum+(chars[i]*10);  
  291.                 if( i==13 ) sum = sum+(chars[i]*5);  
  292.                 if( i==14 ) sum = sum+(chars[i]*8);  
  293.                 if( i==15 ) sum = sum+(chars[i]*4);  
  294.                 if( i==16 ) sum = sum+(chars[i]*2);  
  295.             }  
  296.               
  297.             int checkCode = sum%11;  
  298.             String sortCode = SORTCODES[checkCode];  
  299.               
  300.             if(!sortCode.equals(String.valueOf(chars[chars.length-1])))  
  301.                 return "身份中的校验码不正确";  
  302.         }  
  303.         return ACCEPT;  
  304.     }  
  305.       
  306.     /** 
  307.      * 返回当前年份 
  308.      */  
  309.     private static int getYear(){  
  310.         Date now = new Date();  
  311.         SimpleDateFormat format = new SimpleDateFormat("yyyymmdd");   
  312.         String nowStr = format.format(now);  
  313.         return Integer.parseInt(nowStr.substring(04));  
  314.     }  
  315. }  
package com.nebula;

import java.text.SimpleDateFormat;
import java.util.Date;

public class CheckIdCard {

	
	public static final String ACCEPT = "";	// 检查通过是返回的的成功标识字符串
	
	public static final int EIGHTEEN_IDCARD = 18;	//标识18位身份证号码
	public static final int FIFTEEN_IDCARD = 15;	//标识15位身份证号码
	
	public static final int MAX_MAINLAND_AREACODE = 659004;	//大陆地区地域编码最大值
	public static final int MIN_MAINLAND_AREACODE = 110000;	//大陆地区地域编码最小值
	public static final int HONGKONG_AREACODE = 810000;	//香港地域编码值
	public static final int TAIWAN_AREACODE = 710000;	//台湾地域编码值
	public static final int MACAO_AREACODE = 820000;	//澳门地域编码值
	
	private static final int MAN_SEX = 1;	//标识男性
	private static final int WOMAN_SEX = 2;	//标识女性
	
	//储存18位身份证校验码
	private static final String[] SORTCODES = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String idCard = "142424870329324";
		String result = chekIdCard(1,idCard);
		if( "".equals(result) )
			System.out.println("身份证合法");
		else 
			System.out.println(result);
	}
	
	
	/**
	 * 验证身份证主方法
	 */
	public static String chekIdCard( int sex,String idCardInput ){
		if( idCardInput == null || "".equals(idCardInput))
			return "身份证号码为必填";
		if( idCardInput.length() != 18 && idCardInput.length() !=15 )
			return "身份证号码位数不符";
		if( idCardInput.length() == 15)
			return checkIdCard15(sex,idCardInput);
		else
			return checkIdCard18(sex,idCardInput);
	}
	
	/**
	 * 验证15位身份证号码
	 */
	private static String checkIdCard15( int sex,String idCardInput ){
		String numberResult = checkNumber(FIFTEEN_IDCARD,idCardInput);
		if( !ACCEPT.equals(numberResult))
			return numberResult;
		
		String areaResult = checkArea(idCardInput);
		if( !ACCEPT.equals(areaResult))
			return areaResult;
		
		String birthResult = checkBirthDate( FIFTEEN_IDCARD, idCardInput);
		if( !ACCEPT.equals(birthResult))
			return birthResult;
		
		String sortCodeResult = checkSortCode(FIFTEEN_IDCARD,sex,idCardInput);
		if( !ACCEPT.equals(sortCodeResult))
			return sortCodeResult;
		
		String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD,idCardInput);
		if( !ACCEPT.equals(checkCodeResult))
			return checkCodeResult;
		
		return ACCEPT;
	}
	
	/**
	 * 验证18位身份证号码
	 */
	private static String checkIdCard18( int sex, String idCardInput ){
		
		String numberResult = checkNumber(EIGHTEEN_IDCARD,idCardInput);
		if( !ACCEPT.equals(numberResult))
			return numberResult;
		
		String areaResult = checkArea(idCardInput);
		if( !ACCEPT.equals(areaResult))
			return areaResult;
		
		String birthResult = checkBirthDate( EIGHTEEN_IDCARD, idCardInput);
		if( !ACCEPT.equals(birthResult))
			return birthResult;

		String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD,sex,idCardInput);
		if( !ACCEPT.equals(sortCodeResult))
			return sortCodeResult;
		
		String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD,idCardInput);
		if( !ACCEPT.equals(checkCodeResult))
			return checkCodeResult;
		
		return ACCEPT;
	}
	
	/**
	 * 验证身份证的地域编码是符合规则
	 */
	private static String checkArea( String idCardInput ){
		String subStr = idCardInput.substring(0, 6);
		int areaCode = Integer.parseInt(subStr);
		if( areaCode != HONGKONG_AREACODE && areaCode != TAIWAN_AREACODE
				&& areaCode != MACAO_AREACODE 
				&& ( areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE) )
			return "输入的身份证号码地域编码不符合大陆和港澳台规则";
		return ACCEPT;
	}
	
	/**
	 * 验证身份证号码数字字母组成是否符合规则
	 */
	private static String checkNumber( int idCardType ,String idCard ){
		char[] chars = idCard.toCharArray();
		if( idCardType == FIFTEEN_IDCARD ){
			for( int i = 0; i '9' )
					return idCardType+"位身份证号码中不能出现字母";
			}
		} else {
			for( int i = 0; i < chars.length; i++ ) {
				if( i < chars.length-1 ){
					if( chars[i] > '9' )
						return EIGHTEEN_IDCARD+"位身份证号码中前"+(EIGHTEEN_IDCARD-1)+"不能出现字母";
				} else {
					if( chars[i] > '9' && chars[i] != 'X')
						return idCardType+"位身份证号码中最后一位只能是数字0~9或字母X";
				}
			}
			
		}
			
		return ACCEPT;
	}
	
	/**
	 * 验证身份证号码出生日期是否符合规则
	 */
	private static String checkBirthDate(int idCardType, String idCardInput ){
		String yearResult = checkBirthYear(idCardType,idCardInput);
		if( !ACCEPT.equals(yearResult))
			return yearResult;
		
		String monthResult = checkBirthMonth(idCardType,idCardInput);
		if( !ACCEPT.equals(monthResult))
			return monthResult;
		
		String dayResult = checkBirthDay(idCardType,idCardInput);
		if( !ACCEPT.equals(dayResult))
			return dayResult;

		return ACCEPT;
	}
	
	/**
	 * 验证身份证号码出生日期年份是否符合规则
	 */
	private static String checkBirthYear(int idCardType, String idCardInput){
		if( idCardType == FIFTEEN_IDCARD){
			int year = Integer.parseInt(idCardInput.substring(6, 8));
			if( year < 0 || year > 99 )
				return idCardType+"位的身份证号码年份须在00~99内";
		} else {
			int year = Integer.parseInt(idCardInput.substring(6, 10));
			int yearNow = getYear();
			if( year < 1900 || year > yearNow )
				return idCardType+"位的身份证号码年份须在1900~"+yearNow+"内";
		}
		return ACCEPT;
	}

	/**
	 * 验证身份证号码出生日期月份是否符合规则
	 */
	private static String checkBirthMonth(int idCardType, String idCardInput){
		int month = 0;
		if( idCardType == FIFTEEN_IDCARD)
			month = Integer.parseInt(idCardInput.substring(8, 10));	
		else 
			month = Integer.parseInt(idCardInput.substring(10, 12));
		
		if( month < 1 || month > 12)
			return "身份证号码月份须在01~12内";
			
		return ACCEPT;
	}
	
	/**
	 * 验证身份证号码出生日期天数是否符合规则
	 */
	private static String checkBirthDay(int idCardType, String idCardInput){
		boolean bissextile = false; 
		int year,month,day;
		if( idCardType == FIFTEEN_IDCARD){
			year = Integer.parseInt("19"+idCardInput.substring(6, 8));
			month = Integer.parseInt(idCardInput.substring(8, 10));	
			day = Integer.parseInt(idCardInput.substring(10, 12));
		} else {
			year = Integer.parseInt(idCardInput.substring(6, 10));
			month = Integer.parseInt(idCardInput.substring(10, 12));
			day = Integer.parseInt(idCardInput.substring(12, 14));
		}
		if( year%4 == 0 && year%100 != 0 || year%400 ==0 )	
			bissextile = true;
		
		switch( month ){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			if( day < 1 || day > 31 )
				return "身份证号码大月日期须在1~31之间";
				break;
		case 4:
		case 6:
		case 9:
		case 11:
			if( day < 1 || day > 30 )
				return "身份证号码小月日期须在1~30之间";
				break;
		case 2:
			if(bissextile){
				if( day < 1 || day > 29 )
					return "身份证号码闰年2月日期须在1~29之间";
			}else {
				if( day < 1 || day > 28 )
					return "身份证号码非闰年2月日期年份须在1~28之间";
			}
			break;
		}
		return ACCEPT;
	}
	
	/**
	 * 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数
	 */
	private static String checkSortCode(int idCardType ,int sex,String idCardInput){
		int sortCode = 0;
		if( idCardType == FIFTEEN_IDCARD ){
			sortCode = Integer.parseInt(idCardInput.substring(12, 15));
		} else {
			sortCode = Integer.parseInt(idCardInput.substring(14, 17));
		}
		
		if( sex == MAN_SEX ){
			if( sortCode%2 == 0)
				return "男性的身份证顺序码须为奇数";
		} else {
			if( sortCode%2 != 0)
				return "女性的身份证顺序码须为偶数";		
		}
		
		return ACCEPT;
	}
	
	/**
	 * 验证18位身份证号码校验码是否符合规则
	 */
	private static String checkCheckCode( int idCardType , String idCard ){
		if( idCardType == EIGHTEEN_IDCARD ){
			int sum = 0;
			char[] chars = idCard.toCharArray();
			for( int i=0; i



你可能感兴趣的:(正则表达式)