博客 / 詳情

返回

正則表達式應用之:身份證號識別

今天項目中遇到了身份證號識別的問題,需要識別15或18位的居民身份證,網上查了一下,感覺很有意思,這裏跟大家分享下我的理解過程,希望能幫助大家更好的學習正則表達式。

18位身份證號識別

/^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/

這是一個比較完善的識別正則,直接看的話一頭霧水,我們先來把他分別成5個部分,首先要説明的是:開頭的^符號表示待識別對象的開頭,也就是一個字符串開始的位置,而$表示字符串結束的位置。

part1(身份證1-6位):

^([1-6][1-9]|50)\d{4}

方括號中的1-6表示1-6中的任意數字,1-9表示1-9之間的任意數字,所以[1-6][1-9]組合起來表示的是符合規則的兩個數字,緊接着的|表示或的關係,也就是説可能為50,再接着的\d{4}表示四位數字。因此part1規定了18位居民身份證號的前6位。

part2(身份證7-10位):

(18|19|20)\d{2}

這部分比較容易理解,首先是(18|19|20),表示可能是18、19、20,接着後面的\d{2}表示為兩位數字。

part3(身份證11-12位):

((0[1-9])|10|11|12)

與part2類似,內部括號的內容:(0[1-9])表示兩位數字,其中第一位為0,第二位為0-9中任意數字。豎槓表示或者的關係,表示也有可能是10、11、12,總之這段正則就是對兩位數字進行限制。

part4(身份證13-14位):

(([0-2][1-9])|10|20|30|31)

與part3類似,首先限制了一個兩位數([0-2][1-9]),第一個數為0-2,第二個數為1-9,後面的為除了這個規則之外可能的兩位數(可能是10、20、30、31)

part5(身份證15-18位):

\d{3}[0-9Xx]$

這部分也很好理解,首先是3位數字,然後對最後一位(18位)進行限定,這一位可能是0-9直接的數字,也可能是X或者是小寫x,最後的最後用$表示整個字符串的結尾。

15位身份證號識別

/^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/

15位身份證的正則識別和18位的類似,我們也是拆開一塊一塊的來看。

part1(身份證1-6位):

^([1-6][1-9]|50)\d{4}

這部分與15位的part1一致,不做贅述。

part2(身份證7-10位):

\d{2}((0[1-9])|10|11|12)

首先\d{2}表示兩位數字,然後括號裏面也是表示對兩位數字的規則校驗(這裏校驗的是月份)。

part3(身份證11-12位):

(([0-2][1-9])|10|20|30|31)

這部分也是表示兩位數字,不做贅述。

part4(身份證13-15位):

\d{3}$

三位數字及結束符號。

一個小小的推薦

作為正則表達式的初學者,剛開始一定會覺得拆分正則比較困難,因為有的正則可能寫的很長很長,這裏給大家推薦一個能夠格式化正則的網站,把正則粘上去,網站就會自動的給拆成一塊一塊的。RegExr

總結

不管是前端工程師還是後端工程師,正則表達式都是需要掌握的一門技術,深有感觸的是在刷一些leetcode的時候,正則總是能出其不意的輕巧化解字符串問題,在工作中,正則也大有用處,不得不説,正則真的是太奇妙了!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.