转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148

import java.util.regex.*;
 
/**
 *<p>Title:验证18/15位中国公民身份证号码,并分析有效的数据</p>
 *<p>Description:</p>
</p>
 *<p>Company:Labile</p>
 *@authornotattributable
 *@version1.0
 */
publicclass Verifier {
 
 privatestaticfinal String verify18PatternStr = "(\\d{6})" + "(\\d{8})" + "(\\d{3})" + "([\\d[xX]]{1})";
 privatestaticfinal Pattern verify18Pattern = Pattern.compile(verify18PatternStr);
 privatestaticfinal String verify15PatternStr = "(\\d{6})" + "(\\d{6})" + "(\\d{3})";
 privatestaticfinal Pattern verify15Pattern = Pattern.compile(verify15PatternStr);
 
 
 /**
位的权
   */
 privatestaticfinalintverify18Rights[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
 /**
   *检验码校对表
   */
 privatestaticfinal String verify18CheckDigit[] = {"1","0","X","9","8","7","6","5","4","3","2"};
 
 
 /**
   *地区码
   */
 private String areaNum;
 /**
   *出生时间
   */
 private String birthdayNum;
 /**
   *顺序号
   */
 private String seqNum;
 /**
   *校验码
   */
 private String check_digit;
 
 privateintlength;
 
 publicboolean isMan() {
    int num = Integer.parseInt(seqNum);
    if(num%2==1) {
      returntrue;
    }
    else
      returnfalse;
 }
 
 /**
   *得到生日的日期,格式:yyyy-mm-dd
   *@returnString
   */
 public String getBirthday() {
    String FullBirthdayNum = null;
    if(length==15)//在生日号码前加“19”
      FullBirthdayNum = "19" + birthdayNum;
    else
      FullBirthdayNum = birthdayNum;
 
    String year = FullBirthdayNum.substring(0, 4);
    String month = FullBirthdayNum.substring(4, 6);
    String date = FullBirthdayNum.substring(6, 8);
    return year + "-" + month + "-" + date;
 }
 
 public Verifier(String IDCardNO) throws LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
    if(IDCardNO == null)
      thrownew NumberInvalidException();
    length = IDCardNO.length();
    switch(length) {
      case 15:
        Verifier15(IDCardNO);
        break;
      case 18:
        Verifier18(IDCardNO);
        break;
      default:
        thrownew LengthIllegalException();
    }
 
 }
 
 privatevoid Verifier15(String IDCardNO) throws NumberInvalidException {
 
    Matcher m = verify15Pattern.matcher(IDCardNO);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
 }
 
 privatevoid Verifier18(String IDCardNO) throws CheckDigitInvalidException, NumberInvalidException {
 
    Matcher m = verify18Pattern.matcher(IDCardNO);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
    check_digit = m.group(4);
 
 
    //预期的校验位:
    String expect_check_digit = getCheck_digit18(IDCardNO);
 
    //如果校验位无效
    if(expect_check_digit.equalsIgnoreCase(check_digit)==false)
      thrownew CheckDigitInvalidException();
 }
 
 /**
位/17位身份证号算出校验位
   *@paramIDCardNOString
   *@returnString
   */
 publicstatic String getCheck_digit18(String IDCardNO) {
    //权总值
    int sum = 0;
    for(int i=0; i<=16; i++) {
      int num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
      int right = verify18Rights[i];
      sum = sum + num*right;
    }
    //对权总值取模
    int y = sum % 11;
    returnverify18CheckDigit[y];
 }
 
 publicstatic String IDCardNO15To18(String IDCardNO15) throws
      NumberInvalidException {
 
    Matcher m = verify15Pattern.matcher(IDCardNO15);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
 
    String NO17 = IDCardNO15.substring(0,6) + "19" + IDCardNO15.substring(6,15);
    return NO17 + getCheck_digit18(NO17);
 }
 
 public String getAreaNum() {
    returnareaNum;
 }
 
 public String getBirthdayNum() {
    returnbirthdayNum;
 }
 
 /**
位时返回null
   *@returnString
   */
 public String getCheck_digitNum18() {
    returncheck_digit;
 }
 publicint getLength() {
    returnlength;
 }
 public String getSeqNum() {
    returnseqNum;
 }
 
}

import java.util.regex.*;
 
/**
 *<p>Title:验证18/15位中国公民身份证号码,并分析有效的数据</p>
 *<p>Description:</p>
</p>
 *<p>Company:Labile</p>
 *@authornotattributable
 *@version1.0
 */
publicclass Verifier {
 
 privatestaticfinal String verify18PatternStr = "(\\d{6})" + "(\\d{8})" + "(\\d{3})" + "([\\d[xX]]{1})";
 privatestaticfinal Pattern verify18Pattern = Pattern.compile(verify18PatternStr);
 privatestaticfinal String verify15PatternStr = "(\\d{6})" + "(\\d{6})" + "(\\d{3})";
 privatestaticfinal Pattern verify15Pattern = Pattern.compile(verify15PatternStr);
 
 
 /**
位的权
   */
 privatestaticfinalintverify18Rights[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
 /**
   *检验码校对表
   */
 privatestaticfinal String verify18CheckDigit[] = {"1","0","X","9","8","7","6","5","4","3","2"};
 
 
 /**
   *地区码
   */
 private String areaNum;
 /**
   *出生时间
   */
 private String birthdayNum;
 /**
   *顺序号
   */
 private String seqNum;
 /**
   *校验码
   */
 private String check_digit;
 
 privateintlength;
 
 publicboolean isMan() {
    int num = Integer.parseInt(seqNum);
    if(num%2==1) {
      returntrue;
    }
    else
      returnfalse;
 }
 
 /**
   *得到生日的日期,格式:yyyy-mm-dd
   *@returnString
   */
 public String getBirthday() {
    String FullBirthdayNum = null;
    if(length==15)//在生日号码前加“19”
      FullBirthdayNum = "19" + birthdayNum;
    else
      FullBirthdayNum = birthdayNum;
 
    String year = FullBirthdayNum.substring(0, 4);
    String month = FullBirthdayNum.substring(4, 6);
    String date = FullBirthdayNum.substring(6, 8);
    return year + "-" + month + "-" + date;
 }
 
 public Verifier(String IDCardNO) throws LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
    if(IDCardNO == null)
      thrownew NumberInvalidException();
    length = IDCardNO.length();
    switch(length) {
      case 15:
        Verifier15(IDCardNO);
        break;
      case 18:
        Verifier18(IDCardNO);
        break;
      default:
        thrownew LengthIllegalException();
    }
 
 }
 
 privatevoid Verifier15(String IDCardNO) throws NumberInvalidException {
 
    Matcher m = verify15Pattern.matcher(IDCardNO);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
 }
 
 privatevoid Verifier18(String IDCardNO) throws CheckDigitInvalidException, NumberInvalidException {
 
    Matcher m = verify18Pattern.matcher(IDCardNO);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
    check_digit = m.group(4);
 
 
    //预期的校验位:
    String expect_check_digit = getCheck_digit18(IDCardNO);
 
    //如果校验位无效
    if(expect_check_digit.equalsIgnoreCase(check_digit)==false)
      thrownew CheckDigitInvalidException();
 }
 
 /**
位/17位身份证号算出校验位
   *@paramIDCardNOString
   *@returnString
   */
 publicstatic String getCheck_digit18(String IDCardNO) {
    //权总值
    int sum = 0;
    for(int i=0; i<=16; i++) {
      int num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
      int right = verify18Rights[i];
      sum = sum + num*right;
    }
    //对权总值取模
    int y = sum % 11;
    returnverify18CheckDigit[y];
 }
 
 publicstatic String IDCardNO15To18(String IDCardNO15) throws
      NumberInvalidException {
 
    Matcher m = verify15Pattern.matcher(IDCardNO15);
    if(m.matches()==false) {
      thrownew NumberInvalidException();
    }
 
    String NO17 = IDCardNO15.substring(0,6) + "19" + IDCardNO15.substring(6,15);
    return NO17 + getCheck_digit18(NO17);
 }
 
 public String getAreaNum() {
    returnareaNum;
 }
 
 public String getBirthdayNum() {
    returnbirthdayNum;
 }
 
 /**
位时返回null
   *@returnString
   */
 public String getCheck_digitNum18() {
    returncheck_digit;
 }
 publicint getLength() {
    returnlength;
 }
 public String getSeqNum() {
    returnseqNum;
 }
 
}
 

【转】身份证号码校验与信息提取 - Java 代码的更多相关文章

  1. Java实现身份证号码校验

    二话不说,直接上代码. package hope.identitycodecheck.demo; import java.text.DateFormat; import java.text.Simpl ...

  2. 国民身份证号码校验之“C#/Winform方法实现+案例分析”

    根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出 ...

  3. JS011. 身份证号码校验(仅34行)

    身份证格式 六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位数字校验码 checkIdCard.js checkIdCard: function (idCard){ //15位和1 ...

  4. JS身份证号码校验

    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 var ValideCode = [ 1, 0 ...

  5. js实现手机号码和身份证号码校验

    <script type="text/javascript"> function checkform() { var re; var ss = document.get ...

  6. iOS开发之身份证号码校验

    // //  Card.h //  THCStore // //  Created by Mac on 15/7/15. //  Copyright (c) 2015年 Mac. All rights ...

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

    简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是&q ...

  8. 从身份证号码中获取性别、出生日期、籍贯,并更新mongodb

    有这样的需求,人员信息是存在mongodb中,需要存放人员的身份证.性别.出生日期.籍贯等信息.通过脚本导入这些信息,但是只导入了身份证号码,其他信息空缺.现在需要补全其他信息. 其实身份证信息就包含 ...

  9. Python实现身份证号码有效性验证

    # -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...

随机推荐

  1. Python生成8位随机密码

    #!/usr/bin/env python # -*- coding: utf- -*- import random import string #第一种方法 seed = "1234567 ...

  2. mac osx 启动wireshark闪退

    wireshark启动会提示安装x11 去x11地址安装后 启动还是闪退 原来是姿势不对 这样才行~~ 这一步 这个路径一定要对!路径一定要对!路径一定要对! 然后报错不用管它,如果没反应了,就继续等 ...

  3. Struts2上传图片时报404错误

    可能是struts配置文件中定义的拦截器导致的,后缀拦截导致,将该拦截器去掉,在action类里判断后缀 public String upload()throws Exception{ ActionC ...

  4. C# ?和??运算表达式

    1.单问号(?) 作用:用于给变量设初化的时候,给变量(int类型)赋为null值,而不是0. 例子: public int a; //默认值为0 public int ?b; //默认值为null ...

  5. docker note

    docker --bip="10.1.42.1/16" -d 挂载宿主机目录 Docker支持挂载宿主机目录,支持宿主机目录和容器之间文件目录进行映射,彼此共享: docker r ...

  6. Leetcode: Frog Jump

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  7. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  8. Struts2 标签库讲解

    要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可: <%@ taglib prefix="s" uri="/struts-tags"%& ...

  9. ls -l 列表信息详解

    我们平时用ls -l 命令查看一个目录下的文件和子目录的详悉信息时,会得到一个详细的文件和目录名列表.这个列表包含了文件的属性,所属用户,所属组,创建时间,文件大小等等信息.这些信息到底是什么意思呢? ...

  10. wc移植sae笔记

    1.wc移植到sae---上传图片 ①先看profile.ptl.html中的ajax代码修改functions.js中G_BASE_URL的值.在这里我先写死成->'http://2.idan ...