本文使用 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);
};
验证身份证
- 一个身份证号码有18位。
- 前6位是地区代码,其中第一位取值在1~8。
- 接下来的8位是出生年月日。
- 后续3位是顺序码。
- 最后一位是校验码(数字或 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);
};
DISCUSSION
讨论与反馈