正則匹配身份證號碼

2022-07-15 02:30:07 字數 1833 閱讀 9484

/^[1-9][0-7]\d((19\d(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d(0[13578]|1[02])31)|(19\d02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d(\d|x|x)?$/

首先,位址碼的前2位是省級的編號,到統計局去查詢得知第1位非0,並且目前的範圍為1-9,9是國外的身份證號碼。第2位的範圍為0-7。統計局一般每一年都會公布一次更新的位址碼,但對比多年來的位址碼可以看出位址碼基本上是不變的(要是變了,現有的身份證號碼豈不是都沒用了^_^)。我們的位址碼的正規表示式可以這樣寫:/^[1-9][0-7]\d/,其實,這麼寫不夠精確,倘若要就目前的位址碼寫出精確的表示式,應該這麼寫/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d/,這樣寫顯然精確多了,但表示式長了很多,當然為求精確表示式長一點是可以接受的,但是假如統計局修改了省級位址碼,那麼該表示式要根據實際情況稍作改動,所幸省級位址碼應該是不會變的,呵呵,所以選擇哪一種表示式都是可以的,我這就不寫那麼長的表示式了,所以選擇/^[1-9][0-7]\d/吧。

/^((((19|20)\d)-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d)-(0?[13578]|1[02])-31)|(((19|20)\d)-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/

這個表示式可以匹配1900-2023年的日期,還支援閏年。

我們的表示式不需要匹配那麼長的時間,能夠匹配二十世紀的就夠了,什麼,不知道二十世紀?1900-1999總該知道吧^_^為什麼匹配了這個範圍就夠了呢?去查一下居民身份證的歷史吧,我敢打保票1900-1999的範圍還太大了。至於二十一世紀的新一代,呵呵,就算他是2023年出生的,目前也就9歲(有些演算法是8歲,囧),這些人的號碼應該還列印在戶口簿裡,拿出手也不會產生什麼作用,再說,二十一世紀的人也不屑於我目前所寫的匹配^_^

好吧,廢話太多了,開始匹配日期吧。稍微修改了以上表示式:

/((19\d(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d(0[13578]|1[02])31)|(19\d02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))/

正規表示式裡沒有計算驗證的能力,所以對於順序碼,我們除了基本的匹配外無力於做什麼,所以順序碼的表示式為:/\d/

最後一位數字驗證碼——/(\d|x|x)?$/。之所以那麼寫是因為,最後一位可能值為數字或x,但有些人可能習慣將x寫成小寫的x,我們必須視為正確,而最後的?是為了與15位號碼相容,此時只需將15位號碼的年份用4位表示即可用我們以下整合的表示式進行匹配了——

/^[1-9][0-7]\d((19\d(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d(0[13578]|1[02])31)|(19\d02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d(\d|x|x)?$/

/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d((19\d(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d(0[13578]|1[02])31)|(19\d02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d(\d|x|x)?$/

身份證號碼

每乙個人自出生後都會有乙個身份證號碼。根據我國有關部門規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為 六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。居民身份證是國家法定的證明公民個人身份的有效證件。例如 對於身份證號碼330719...

身份證號碼驗證

說明 驗證身份證的有效性 引數 cid 身份證號碼 返回 地方 出生時間 性別 private string checkcidinfo string cid if cid.length 18 char c cid cid.length 1 bool last false if c 0 c 9 c a...

身份證號碼檢測

華為的上機題 我國公民的身份證號碼特點如下 1 長度為18位 2 第1 17位只能為數字 3 第18位可以是數字或者小寫英文本母x。4 身份證號碼的第7 14位表示持有人生日的年 月 日資訊。例如 511002 19880808 0111或511002 19880808011x。請實現身份證號碼合法...