返回

护照号码正则表达式教程

正则表达式

一、正则解释

正则表达式:/(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/

  • 分组 1:
    • ^[EeKkGgDdSsPpHh]:护照开头为 E、K、G、D、S、P、H
    • \d{8}:后面紧跟 8 位数字
  • 分组 2:
    • ^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45])):开头为
      • E 后跟一个十六进制数字
      • D 或 S 后跟 E
      • K 后跟 J
      • M 后跟 A
      • 14 或 15
    • \d{7}:后面紧跟 7 位数字

二、使用场景

此正则表达式用于验证护照号码,包括香港和澳门。

三、代码示例

JavaScript

const regex = /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/;

const passportNumbers = ['s28233515', '141234567', '159203084', 'MA1234567', 'K25345719'];

for (const passportNumber of passportNumbers) {
  console.log(`${passportNumber}: ${regex.test(passportNumber)}`);
}

Java

import java.util.regex.Pattern;

public class PassportNumberValidator {

    private static final Pattern REGEX = Pattern.compile("(^[EeKkGgDdSsPpHh]\\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\\d{7}$)");

    public static void main(String[] args) {
        String[] passportNumbers = {"s28233515", "141234567", "159203084", "MA1234567", "K25345719"};

        for (String passportNumber : passportNumbers) {
            System.out.println(passportNumber + ": " + REGEX.matcher(passportNumber).matches());
        }
    }
}

PHP

<?php

$regex = '/(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/';

$passportNumbers = ['s28233515', '141234567', '159203084', 'MA1234567', 'K25345719'];

foreach ($passportNumbers as $passportNumber) {
    echo "$passportNumber: " . (preg_match($regex, $passportNumber) ? 'Valid' : 'Invalid') . "\n";
}

Python

import re

regex = r"(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)"

passportNumbers = ['s28233515', '141234567', '159203084', 'MA1234567', 'K25345719']

for passportNumber in passportNumbers:
    print(f"{passportNumber}: {bool(re.match(regex, passportNumber))}")