java对身份证验证及正则表达式解析

package service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import org.junit.Test;

public class TestRegex {
    public static boolean isChineseName(String realname){
         return Pattern.matches("[\u4e00-\u9fa5|·]{2,15}",realname);
    }
    public static boolean isCardId(String cardid){
         return Pattern.matches("^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", cardid);
    }
    public static String[] randomArray(int length){
        int index = 0;
        String temp = ",";
        for(int ii=0;ii<1000;ii++){
            for(int i=0;i<length;i++){
                index = (int) (Math.random()*10);
                temp += ( index + "");
            }
            temp +=",";
        }
        return temp.split(",");
    }
    //身份证前1位每位加权因子
    private static int[] power = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    //身份证第18位校检码
    private static String[] refNumber ={"1", "0", "X", "9", "8", "7", "6", "5", "4", "3"};
    //省(直辖市)代码表
    private String provinceCode[] = { "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" };
    /**
     * 检查身份证的省份信息是否正确(使用与18/15位身份证)
     * @param provinceid
     * @return
     */
    public boolean checkProvinceId(String provinceid){
        for (String id : provinceCode) {
            if (id.equals(provinceid)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 校验身份证第18位是否正确(只适合18位身份证)
     * @param cardId
     * @return
     */
    public static boolean checkCardIdLastNum(String cardId){
        if(cardId.length() != 18){
            return false;
        }
        char[] tmp = cardId.toCharArray();
        int[] cardidArray = new int[tmp.length-1];
        int i=0;
        for(i=0;i<tmp.length-1;i++){
            cardidArray[i] = Integer.parseInt(tmp[i]+"");
        }
        String checkCode = sumPower(cardidArray);
        String lastNum = tmp[tmp.length-1] + "";
        if(lastNum.equals("x")){
            lastNum = lastNum.toUpperCase();
        }
        if(!checkCode.equals(lastNum)){
            return false;
        }
        return true;
    }
    /**
     * 计算身份证的第十八位校验码
     * @param cardidArray
     * @return
     */
    public static String sumPower(int[] cardidArray){
        int result = 0;
        for(int i=0;i<power.length;i++){
            result += power[i] * cardidArray[i];
        }
        return refNumber[(result%11)];
    }
    /**
     * 判断日期是否有效
     * @param inDate
     * @return
     */
     public boolean isValidDate(String inDate) {
        if (inDate == null){
          return false;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        if (inDate.trim().length() != dateFormat.toPattern().length()){
              return false;
        }
        dateFormat.setLenient(false);//严格的日期匹配
        try {
            dateFormat.parse(inDate.trim());
        } catch (ParseException e) {
            return false;
        }
        return true;
    }
    //@Test
    public void testName(){
        String[] array = {"钟·","在哪"};
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]+":"+isChineseName(array[i]));
        }
    }
    //
    //@Test
    public void testCardId(){
        String[] array = randomArray(18);
        int index = 0,sum =0;
        for(int i=0;i<array.length;i++){
            sum += 1;
            if(isCardId(array[i])){
                index += 1;
            }
            System.out.println(array[i]+":"+isCardId(array[i]));
        }
        double ret = index/sum;
        System.out.println(index+","+sum+","+ret);
    }
    //@Test
    public void testArray(){
        String[] array = randomArray(15);
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
    //@Test
    public void testLastNum(){
        String[] cardId = {"440982199563272359","43010219890414298x"};
        for(int i=0;i<cardId.length;i++){
            System.out.println(cardId[i]+":"+checkCardIdLastNum(cardId[i]));
        }
    }
    //@Test
    public void testProcince(){
        String[] cardId = {"440982199563272359","43010219890414298x"};
        for(int i=0;i<cardId.length;i++){
            System.out.println(cardId[i].substring(0,2)+":"+checkProvinceId(cardId[i].substring(0,2)));
        }

    }
    @Test
    public void testDate(){
        //String[] cardId = {"440982199003272359","43010219890414298x"};
        String cardId[] = {"445102198904312332",
                "131100200102290696",
                "51042119710630173X",
                "340823196806263613",
                "340703197410050615",
                "440982195201230696",
                "130203196110239132",
                "321101197411218776",
                "340501196812265178",
                "330424197204277791",
                "61040219710929439X",
                "230826195610286476",
                "350305196501252819",
                "450881197212026374",
                "220282197010121032",
                "341723197209084377",
                "451024197211265090",
                "330727195609144416",
                "411626197504219395",
                "230605196203286219",
                "21068119520426399X",
                "511821195404264774",
                "622923197107299798",
        };
        for(int i=0;i<cardId.length;i++){

            System.out.println(cardId[i].substring(6,14)+":"+isValidDate(cardId[i].substring(6,14)));
        }
    }
}
时间: 2024-12-21 14:29:36

java对身份证验证及正则表达式解析的相关文章

Java中邮箱验证的正则表达式

public static boolean checkEmail(String email) { String regex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; return Pattern.matches(regex, email); }

身份证验证(java)

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; p

java 18位身份证验证小组件idchecker

原文:java 18位身份证验证小组件idchecker 源代码下载地址:http://www.zuidaima.com/share/1550463500012544.htm 代码运行结果: 其它调用方法: package com.zuidaima.idchecker.test; import cn.idchecker.check.Checker; /** * idchecker测试 * @author http://www.zuidaima.com * */ public class Test

java身份证验证

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;  

Java、Android身份证验证工具 支持15/18位、地区、生日和校验码验证

首先科普一下身份证的一些知识(知道的勿喷) 1-2 位:代表升级行政区代码 3-4 位:代表地级行政区划分代码 5-6 位:代表县区行政区分代码 7-14 位:代表出生年.月.日,例如:19900101 15-17 位:代表 顺序码,同一地区同年.同月.同日出生人的编号,奇数是男性,偶数是女性 18 位:代表校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示 注:另外有些15位的身份证号码,年份使用2位数字表示的,并且没有最后一位校验码:从1999年10月1日起,全国实行公

15/18位身份证号码验证的正则表达式总结(详细版)

前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

身份证号码的正则表达式及验证详解(JavaScript,Regex)

简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是"公民身份号码".根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 以北京市朝阳区一女性身份证号码为

inform表单验证,正则表达式,用户名,身份证,密码,验证码

最近利用空闲时间写了部分表单验证,包括用户名,身份证,密码,验证码,仅为自己巩固最近所学的知识 表单的样式使用的是table布局,因为觉得DIV布局定位比较麻烦,table有三列,分别为基本信息,输入的信息,提示信:输入信息栏,插入表单 1 <body> 2 <table> 3 <tr> 4 <td><p>会员名:</p></td> 5 <td><input type="text" n

正则表达式解析

正则表达式解析 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 一.正则表达式的用途 通过使用正则表达式,可以:1.测试字符串内的模式.例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式.这称为数据验证.2.替换文本.可以