^[1-9]\d(18|19|([23]\d))\d((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d[0-9xx]$先拆分成五段
^[1-9]\d
(18|19|([23]\d))\d
((0[1-9])|(10|11|12))
(([0-2][1-9])|10|20|30|31)
\d[0-9xx]$
第一段為位址碼,6位數字,不以0開頭
第二三四段為生日碼,18位身份證的生日碼規則為年月日,例:2023年10月15日->20201015
第五段為順序碼+校驗碼,18位身份證的順序碼為3位數字,校驗碼1位,校驗碼為0-9或者大小寫的英文x
對各段的詳細解析:
^[1-9]\d:匹配前6位位址碼,不以0開頭即以1-9開頭,並匹配後續的5位數字
因為不能以0開頭,因此不能換成^\d,\d會匹配到0-9
(18|19|([23]\d))\d:匹配年份,匹配1800-2023年:
(18|19|([23]\d)):匹配年份的前兩位,18xx年19xx年,2開頭的年份或者3開頭的年份需要補齊一位,因此需要\d
\d:匹配完年份前兩位需要補齊後續兩位數字,因此需要\d
對於[23]\d原鏈結裡有人有疑問,在這裡補充下:((0[1-9])|(10|11|12)):匹配月份中括號[ ]表示匹配中括號[ ]內的任意乙個字元,只匹配一次
所以[23]只會匹配到乙個2或者3,因為需要匹配到20xx-39xx的年份前兩位,因此需要加上\d,再多匹配乙個數字才能正確匹配
所以[23]\d的匹配的規則為2加乙個數字或者3加乙個數字
因此(18|19|([23]\d))\d才能正確匹配到18xx-39xx年
(0[1-9]):匹配01-09的月份
|(10|11|12):或者匹配10-12月份
(([0-2][1-9])|10|20|30|31):匹配天數
([0-2][1-9]):匹配01-09、 11-19、21-29的天數
|10|20|30|31:或者匹配10,20,30,31的天數
\d[0-9xx]$:匹配最後四位,先匹配三位數字的順序碼,並以校驗碼結束,校驗碼為單個0-9或者大小寫的x
正規表示式驗證身份證
function isidcardno num d 0 9 x test num 校驗位按照iso 7064 1983.mod 11 2的規定生成,x可以認為是數字10。下面分別分析出生日期和校驗位 var len,re len num.length if len 15 d d d d var ar...
15位和18位身份證的正規表示式及其驗證
1 簡單的正規表示式 1 preg match d d dx id card 2 preg match d 18 19 20 d 01 d 0123 d d d x id card 3 preg match d d d x x id card 2 複雜並且嚴格一些的驗證 這個可以驗證15位和18位的...
15位和18位身份證的正規表示式及其驗證
1 簡單的正規表示式 1 preg match d d dx id card 2 preg match d 18 19 20 d 01 d 0123 d d d x id card 3 preg match d d d x x id card 2 複雜並且嚴格一些的驗證 這個可以驗證15位和18位的...