`
ontheway_lyl
  • 浏览: 45139 次
社区版块
存档分类
最新评论

身份证号java正则表达式验证

    博客分类:
  • java
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 二话不说,直接上代码

/**
	 * 18位身份证校验,粗略的校验
	 * @author lyl
	 * @param idCard
	 * @return
	 */
	public static boolean is18ByteIdCard(String idCard){
		Pattern pattern1 = Pattern.compile("^(\\d{6})(19|20)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d|X|x)?$"); //粗略的校验
		Matcher matcher = pattern1.matcher(idCard);
		if(matcher.matches()){
			return true;
		}
		return false;
	}
	/**
	 * 18位身份证校验,比较严格校验
	 * @author lyl
	 * @param idCard
	 * @return
	 */
	public static boolean is18ByteIdCardComplex(String idCard){
		Pattern pattern1 = Pattern.compile("^(\\d{6})(19|20)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d|X|x)?$"); 
		Matcher matcher = pattern1.matcher(idCard);
		int[] prefix = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
		int[] suffix = new int[]{ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
		if(matcher.matches()){
			Map<String, String> cityMap = initCityMap();
			if(cityMap.get(idCard.substring(0,2)) == null ){
				return false;
			}
			int idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
			for(int i=0;i<17;i++){
				idCardWiSum+=Integer.valueOf(idCard.substring(i,i+1))*prefix[i];
			}
			
			int idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
			String idCardLast=idCard.substring(17);//得到最后一位身份证号码
			
			//如果等于2,则说明校验码是10,身份证号码最后一位应该是X
			if(idCardMod==2){
				if(idCardLast.equalsIgnoreCase("x")){
					return true;
				}else{
					return false;
				}
			}else{
			    //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
			    if(idCardLast.equals(suffix[idCardMod]+"")){
			    	return true;
			    }else{
			    	return false;
			    }
		   }
		}
		return false;
	}
	
	private static Map<String, String> initCityMap(){
		Map<String, String> cityMap = new HashMap<String, String>();
			cityMap.put("11", "北京");
			cityMap.put("12", "天津");
			cityMap.put("13", "河北");
			cityMap.put("14", "山西");
			cityMap.put("15", "内蒙古");
			
			cityMap.put("21", "辽宁");
			cityMap.put("22", "吉林");
			cityMap.put("23", "黑龙江");
			
			cityMap.put("31", "上海");
			cityMap.put("32", "江苏");
			cityMap.put("33", "浙江");
			cityMap.put("34", "安徽");
			cityMap.put("35", "福建");
			cityMap.put("36", "江西");
			cityMap.put("37", "山东");
			
			cityMap.put("41", "河南");
			cityMap.put("42", "湖北");
			cityMap.put("43", "湖南");
			cityMap.put("44", "广东");
			cityMap.put("45", "广西");
			cityMap.put("46", "海南");
			
			cityMap.put("50", "重庆");
			cityMap.put("51", "四川");
			cityMap.put("52", "贵州");
			cityMap.put("53", "云南");
			cityMap.put("54", "西藏");
			
			cityMap.put("61", "陕西");
			cityMap.put("62", "甘肃");
			cityMap.put("63", "青海");
			cityMap.put("64", "宁夏");
			cityMap.put("65", "新疆");
			
//			cityMap.put("71", "台湾");
//			cityMap.put("81", "香港");
//			cityMap.put("82", "澳门");
//			cityMap.put("91", "国外");
//			System.out.println(cityMap.keySet().size());
			return cityMap;
		}

 

分享到:
评论
1 楼 perseusli 2017-12-30  
优化了一下:
public class IdcardNoValidateUtil {

    private final static Map<String, String> cityMap;
    //粗略的校验
    private static final Pattern pattern = Pattern.compile("^(\\d{6})(19|20)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d|X|x)?$");

    /**
     * 18位身份证校验,粗略的校验
     * @author lyl
     * @param idCard
     * @return
     */
    public static boolean is18ByteIdCard(CharSequence idCard){
        return pattern.matcher(idCard).matches();
    }
    /**
     * 18位身份证校验,比较严格校验
     * @author lyl
     * @param idCard
     * @return
     */
    public static boolean is18ByteIdCardComplex(CharSequence idCard){
        int[] prefix = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        char[] suffix = new char[]{ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
        if(is18ByteIdCard(idCard)){
            if(cityMap.get(idCard.subSequence(0,2).toString()) == null ){
                return false;
            }
            int idCardWiSum=0;  //用来保存前17位各自乖以加权因子后的总和
            for(int i=0;i<17;i++){
                idCardWiSum+=(idCard.charAt(i) - '0') *prefix[i];
            }

            int idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
            char idCardLast=idCard.charAt(17);//得到最后一位身份证号码

            return idCardLast == suffix[idCardMod];
        }
        return false;
    }

    static {
        cityMap = new HashMap<>();
        cityMap.put("11", "北京");
        cityMap.put("12", "天津");
        cityMap.put("13", "河北");
        cityMap.put("14", "山西");
        cityMap.put("15", "内蒙古");

        cityMap.put("21", "辽宁");
        cityMap.put("22", "吉林");
        cityMap.put("23", "黑龙江");

        cityMap.put("31", "上海");
        cityMap.put("32", "江苏");
        cityMap.put("33", "浙江");
        cityMap.put("34", "安徽");
        cityMap.put("35", "福建");
        cityMap.put("36", "江西");
        cityMap.put("37", "山东");

        cityMap.put("41", "河南");
        cityMap.put("42", "湖北");
        cityMap.put("43", "湖南");
        cityMap.put("44", "广东");
        cityMap.put("45", "广西");
        cityMap.put("46", "海南");

        cityMap.put("50", "重庆");
        cityMap.put("51", "四川");
        cityMap.put("52", "贵州");
        cityMap.put("53", "云南");
        cityMap.put("54", "西藏");

        cityMap.put("61", "陕西");
        cityMap.put("62", "甘肃");
        cityMap.put("63", "青海");
        cityMap.put("64", "宁夏");
        cityMap.put("65", "新疆");

        cityMap.put("71", "台湾");
        cityMap.put("81", "香港");
        cityMap.put("82", "澳门");
        cityMap.put("91", "国外");
    }
}

相关推荐

    使用Java正则表达式实现一个简单的身份证号码验证

    ### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...

    java正则表达式验证IP地址

    Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

    正则表达式校验身份证号码

    本文将详细介绍如何使用正则表达式进行身份证号码的有效性和合理性验证。 #### 简单校验:正则表达式的使用 简单校验主要检查身份证号码是否为15位或18位,并且对于18位号码,最后一位可以是数字或大写“X”。这种...

    Java身份证号码合法性校验算法,正则表达式。

    最完善的身份证号码合法性校验Java算法,适合Android平台,可以直接拿来在项目中使用,正则表达式。

    java 正则表达式工具类,手机号码等

    java 验证手机号码 身份证 email url 以及其他常用的正则表达式的验证方法。

    正则表达式 Java 判断字串是否合理

    根据给定的文件信息,我们可以总结出以下...综上所述,通过以上知识点可以看出,Java正则表达式在处理各种格式的数据验证时非常实用且灵活。开发者可以根据具体需求选择合适的正则表达式来提高代码的健壮性和安全性。

    Java正则表达式[web输入验证]

    Java正则表达式[web输入验证&lt;身份证,邮箱,URL,手机号等&gt;]

    java正则表达式教程html版带目录

    Java正则表达式是Java编程语言中的一个强大工具,它用于模式匹配和字符串处理,尤其在数据验证、文本检索和替换等方面发挥着重要作用。本教程是专为初学者设计的HTML版,旨在帮助读者快速掌握Java正则表达式的概念和...

    Java正则表达式验证web端输入[身份证,邮箱,手机,中文字符]

    本教程将详细介绍如何使用Java正则表达式来验证身份证、邮箱、手机号码和中文字符这四种常见的用户输入。 1. 身份证验证: 身份证号码分为15位和18位两种,18位身份证包含地区码、出生日期、顺序号和校验码。验证18...

    java正则表达式实例(邮箱,车牌,密码,url,IP,身份证,车牌等等)

    ### Java正则表达式实例详解 #### 一、概述 正则表达式是一种强大的文本处理工具,能够帮助我们在字符串中查找、替换或提取特定模式的数据。在Java编程中,正则表达式的应用非常广泛,例如在表单验证、数据清洗等...

    java 正则表达式工具类,验证手机号码 身份证 email 全

    java 正则表达式工具类,验证手机号码 身份证 email

    Java 正则表达式学习

    本文介绍了Java正则表达式的基本概念与常见应用场景,包括但不限于数字、字母、身份证号码、日期、邮箱、电话号码及网址的匹配方法。通过学习这些基础知识和实战示例,你将能够在实际开发中更加灵活地应用正则表达式...

    IP 正则表达式验证

    javascript 手机号码正则表达式验证函数JS正则表达式验证数字代码JavaScript正则表达式验证身份证号码是否合法(两种方法)jquery正则表达式验证(手机号、身份证号、中文名称)邮箱地址正则表达式验证代码合集软件...

    正则表达式做验证的范例

    在编程中,正则表达式常用于数据验证,确保用户输入的数据符合特定格式或规则,从而提高程序的安全性和用户体验。相比于传统的if语句或其他条件判断,正则表达式提供了更简洁、灵活的解决方案。 正则表达式的语法...

    Java常用正则表达式.txt

    ### Java常用正则表达式详解 #### 匹配腾讯QQ号 **正则表达式:** [1-9][0-9]{4,} **评注:** 腾讯QQ号从10000开始。 - **解析:** 此表达式确保了QQ号的第一个数字必须是非零数字(即1到9之间的任意一个),接着...

    正则表达式工具(java版)

    早期我用c#开发了一个正则表达式工具,而现在这个版本是我用java实现的。 众所周知,java在桌面应用方面一直是短板,c#则有着天然的优势。然作为一个java开发人员,采用java的编程思想来实现此功能还是很有必要的。

    JAVA正则表达式语法大全

    ### JAVA正则表达式语法大全 #### 正则表达式简介 正则表达式是一种用于匹配字符串中字符组合的强大工具,在编程中广泛应用于文本搜索、替换等操作。Java中的正则表达式支持标准的正则表达式语法,并通过`java.util...

Global site tag (gtag.js) - Google Analytics