身份證號碼驗證,包含兩代身份證,第一代和第二代身份證
第一代身份證15位,其編碼規則順序從左至右依次為6位數字地址碼,6位數字出生年份后兩位及日期,3位數字順序碼。
格式:^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$
正則表達式分解如下:
[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}:順序碼三位,沒有校驗碼
第二代身份證18位,其編碼規則順序從左至右依次為6位數字地址碼,8位數字出生年份日期碼,3位數字順序碼,1位數字校驗碼(X有時會出現):
格式: ^[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} :前六位地區,非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]:順序碼三位 + 一位校驗碼
程序:
private void BtnOK_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrEmpty(tbxName.Text)) { MessageBox.Show($"姓名不可為空,請重新輸入!"); tbxName.Focus(); return; } Name = tbxName.Text; Regex re = new Regex(@"(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)|(^[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]$)"); if (re.IsMatch(tbxIDNumber.Text)) { IDNumber = tbxIDNumber.Text; MessageBox.Show($"姓名:{Name},身份證號碼:{IDNumber},符合規則"); Close(); } else { MessageBox.Show($"身份證號碼格式不正確,請輸入15或者18位的身份證號碼。"); tbxIDNumber.Focus(); } }