在項目中遇到身份證號碼驗證,百度了一些資料,太簡單的和太複雜的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位的,那麼這兩個版本有什麼區別呢?正則表達式
從圖片中能夠看出,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