18位身份證的正規表示式並說明

2021-10-06 19:40:35 字數 1192 閱讀 6367

^[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原鏈結裡有人有疑問,在這裡補充下:

中括號[ ]表示匹配中括號[ ]內的任意乙個字元,只匹配一次

所以[23]只會匹配到乙個2或者3,因為需要匹配到20xx-39xx的年份前兩位,因此需要加上\d,再多匹配乙個數字才能正確匹配

所以[23]\d的匹配的規則為2加乙個數字或者3加乙個數字

因此(18|19|([23]\d))\d才能正確匹配到18xx-39xx年

((0[1-9])|(10|11|12)):匹配月份

(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位的...