跳到主要内容

正则表达式在JavaScript中的实践

· 阅读需 3 分钟

使用JavaScript进行实践。

在JavaScript中,正则表达式也是对象,这些模式用于RegExpexectest以及Stringmatch replace search等方法

正则表达式很少有最终方案,更常见的情况是取决于对不确定性的容忍程度,同时存在多种解决方法。

创建一个正则表达式

字面量的方式

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

/[0-9]/

RegExp

调用RegExp对象的构造函数

new RegExp("[0-9]")

标志

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

/pattern/flagsnew 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);
};

源码