返回

正则表达式教程:校验二代身份证号(18位)

正则表达式

在开发过程中,我们经常会遇到需要验证用户输入数据的情况,比如判断用户输入的手机号、邮箱地址或者身份证号是否符合规范。这时候,正则表达式就派上用场了,它就像一把万能钥匙,可以帮我们快速、准确地匹配和筛选字符串。今天,我们就来聊聊如何用正则表达式来校验二代身份证号码。

二代身份证号码是一串18位的数字和字母组合,它包含了个人信息,例如地区、出生日期和校验码。为了保证数据的准确性和安全性,我们需要对身份证号码进行严格的校验。

正则表达式提供了一种灵活且强大的方式来字符串的模式。我们可以利用它来定义身份证号码的规则,例如:

  • 首位数字不能为0;
  • 出生年份必须在合理的范围内;
  • 月份和日期必须符合实际情况;
  • 最后一位校验码的计算方式也需要考虑在内。

下面,我们来看一个具体的正则表达式示例:

/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/

这个正则表达式看起来有点复杂,但我们可以把它拆解开来理解。

  • ^ 表示匹配字符串的开头;
  • [1-9]\d{5} 表示前6位是1-9开头,后面5位是任意数字,这部分对应的是地区代码;
  • (?:18|19|20)\d{2} 表示年份,可以是18、19或20开头的两位数字;
  • (?:0[1-9]|10|11|12) 表示月份,可以是01-12;
  • (?:0[1-9]|[1-2]\d|30|31) 表示日期,可以是01-31;
  • \d{3} 表示后三位是任意数字,这部分对应的是顺序码;
  • [\dXx]$ 表示最后一位是数字或字符X,这部分对应的是校验码;
  • $ 表示匹配字符串的结尾。

有了这个正则表达式,我们就可以在各种编程语言中使用它来校验身份证号码了。

下面是一些代码示例:

JavaScript:

const idNumber = "12345619991205131x";
const regex = /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/;

if (regex.test(idNumber)) {
  console.log("身份证号合法");
} else {
  console.log("身份证号不合法");
}

Java:

import java.util.regex.Pattern;

public class IdNumberValidation {
  public static void main(String[] args) {
    String idNumber = "12345619991205131x";
    String regex = "^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]
import java.util.regex.Pattern;

public class IdNumberValidation {
  public static void main(String[] args) {
    String idNumber = "12345619991205131x";
    String regex = "^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]$";

    Pattern pattern = Pattern.compile(regex);
    boolean isValid = pattern.matcher(idNumber).matches();

    System.out.println("身份证号" + (isValid ? "合法" : "不合法"));
  }
}
quot;
; Pattern pattern = Pattern.compile(regex); boolean isValid = pattern.matcher(idNumber).matches(); System.out.println("身份证号" + (isValid ? "合法" : "不合法")); } }

Python:

import re

id_number = "12345619991205131x"
regex = r"^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]
import re

id_number = "12345619991205131x"
regex = r"^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$"

if re.match(regex, id_number):
  print("身份证号合法")
else:
  print("身份证号不合法")
quot;
if re.match(regex, id_number): print("身份证号合法") else: print("身份证号不合法")

通过这些代码示例,我们可以看到,使用正则表达式来校验身份证号码是非常方便的。

当然,这只是一个简单的示例,实际应用中可能需要根据具体的需求对正则表达式进行调整。例如,如果需要校验身份证号码的地址信息,就需要对地区代码部分进行更细致的匹配。

常见问题解答:

  1. 问:正则表达式中的 (?:...) 是什么意思?

    答:(?:...) 表示非捕获分组,它会匹配括号内的内容,但不会将匹配结果保存到分组中。

  2. 问:正则表达式中的 \d 是什么意思?

    答:\d 表示匹配任意数字字符,相当于 [0-9]

  3. 问:正则表达式中的 [] 是什么意思?

    答:[] 表示字符集合,它会匹配方括号内的任意一个字符。

  4. 问:正则表达式中的 | 是什么意思?

    答:| 表示逻辑或,它会匹配它两侧的任意一个表达式。

  5. 问:如何学习正则表达式?

    答:网上有很多正则表达式的教程和工具,可以通过学习这些资料来掌握正则表达式的语法和使用方法。此外,还可以通过练习来巩固所学知识,例如尝试编写一些简单的正则表达式来匹配不同的字符串。

希望这篇文章能够帮助你理解如何使用正则表达式来校验二代身份证号码。正则表达式是一个非常强大的工具,掌握它可以让你在处理字符串方面更加得心应手。