本文使用 JavaScript 进行实践。

在 JavaScript 中,正则表达式也是对象,通常配合 RegExp 的 exec、test 和 String 的 match、replace、search 等 API 使用。

正则表达式很少存在唯一的最终方案,更多时候取决于对不确定性的容忍程度,同一个问题往往有不止一种解法。

创建一个正则表达式

字面量的方式

由两个斜杠 // 之间的模式组成。

/[0-9]/

RegExp

调用 RegExp 对象的构造函数。

new RegExp("[0-9]")

标志

标志描述
g全局搜索
i不区分大小写搜索
m多行搜索

/pattern/flags 或 new RegExp("pattern", "flags")。

常用正则表达式

匹配手机号

因为手机号段经常更新,不断放出新号段,所以不用限制得太死。

以1开头,后面再接10位数字,组成11位手机号。

const PHONE_NUMBER_REGEXP = /^1\d{10}$/;

export const isPhoneNumber = (phoneNumber?: string) => {
  if (!phoneNumber) {
    return false;
  }
  return PHONE_NUMBER_REGEXP.test(phoneNumber);
};

验证身份证

  1. 一个身份证号码有18位。
  2. 前6位是地区代码,其中第一位取值在1~8。
  3. 接下来的8位是出生年月日。
  4. 后续3位是顺序码。
  5. 最后一位是校验码(数字或 X)。

简单版

/[1-8]\d{16}[0-9X]/i

严格版

正则说明
[1-8]\d{5}前6位
[1|2]\d{3}年
[01]\d月
[0-3]\d{4}日 + 3位顺序码
(\d|x)最后一位是校验码
const ID_CARD_REGEXP = /^[1-8]\d{5}[1-2]\d{3}[01]\d[0-3]\d{4}(\d|X)$/i;

export const isIDCard = (IDCard?: string) => {
  if (!IDCard) {
    return false;
  }
  return ID_CARD_REGEXP.test(IDCard);
};

匹配电子邮箱地址

简单版

/^\w+@\w+\.\w+/i

如果邮箱是 aa.aa@aa.com 这种形式,就匹配不上了。

严格版

const EMAIL_NUMBER_REGEXP = /^(\w+\.)*\w+@(\w+\.)+[A-Za-z]+/i;

export const isEmail = (email?: string) => {
  if (!email) {
    return false;
  }
  return EMAIL_NUMBER_REGEXP.test(email);
};

匹配 IP 地址

简单版

/(\d{1,3}\.){3}\d{1,3}/i

严格版

const IP_REGEXP =
  /^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/;

export const isIP = (IP?: string) => {
  if (!IP) {
    return false;
  }
  return IP_REGEXP.test(IP);
};

匹配URL地址

简单版

/^https?:\/\/[-\w.]+(:\d+)?(\/([\w\/_.]*)?)?$/i

严格版

const URL_REGEXP =
  /^https?:\/\/(\w*:\w*@)?[-\w.]+(:\d+)?(\/([\w\/_.]*(\?\S+)?)?)?$/i;

export const isURL = (URL?: string) => {
  if (!URL) {
    return false;
  }
  return URL_REGEXP.test(URL);
};

匹配中文字

const CHINESE_REGEXP = /^[\u4e00-\u9fa5]*$/;

export const isOnlyChinese = (chinese?: string) => {
  if (!chinese) {
    return false;
  }
  return CHINESE_REGEXP.test(chinese);
};

源码