15位、18位身份證號碼正則表達式

身份證正則表達式

在項目中遇到身份證號碼驗證,百度了一些資料,太簡單的和太複雜的pass,綜合了一些案例,取長補短,造成了個折中版本的,正則表達式以下:web

var reg =/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/;
if(!reg.test(IDCard)){
    this.warnTips({txt:'請輸入正確的身份證號碼'});
    return false;
}

身份證介紹

身份證分15位和18位的,那麼這兩個版本有什麼區別呢?正則表達式

  1. 第二代身份證,18位 XXXXXX yyyy MM dd 375 0
  2. 第一代身份證,15位 XXXXXX yy MM dd 75 0

圖片描述

從圖片中能夠看出,this

1-6位爲地區編碼
7-10  出身年份 4位,第一代身份證只有兩位
11-14 出身年月日 4位
15-18 順序碼+校驗碼 18位身份證4位,最後一位多是X, 15位身份證順序碼3位,沒有校驗碼

表達式介紹

看18位的身份證正則:
[1-9]\d{5}                 前六位地區,非0打頭
(18|19|([23]\d))\d{2}      出身年份,覆蓋範圍爲 1800-3999 年
((0[1-9])|(10|11|12))      月份,01-12月
(([0-2][1-9])|10|20|30|31) 日期,01-31天
\d{3}[0-9Xx]:              順序碼三位 + 一位校驗碼

15位的身份證:
[1-9]\d{5}                  前六位地區,非0打頭     
\d{2}                       出生年份後兩位00-99
((0[1-9])|(10|11|12))       月份,01-12月
(([0-2][1-9])|10|20|30|31)  日期,01-31天
\d{3}                       順序碼三位,沒有校驗碼

表達式存在不足

這個身份證表達式只是折中版本的校驗,知足15位和18位身份證校驗的基本需求了,可是還存在一些不足,網上有很是精確的身份證校驗,可是代碼太多,各類js驗證,參考資料連接中有提供。編碼

地址碼斷定不夠精確。例:我國並不存在16,26開頭的地區,卻可經過驗證spa

日期斷定不夠精確。例:19490231也可經過驗證,而2月並不存在31日
校驗碼是由17位本體碼計算得出,方案1並未校驗此碼
ps: 這個連接中的15位正則表達式錯的,最後順序碼應該是3位。
15/18位身份證號碼驗證的正則表達式總結.net

參考資料

身份證號碼的正則表達式及驗證詳解(JavaScript,Regex)code

大陸--身份證(本國人)正則表達式htm

15/18位身份證號碼正則表達式(詳細版)blog

相關文章
相關標籤/搜索