18个实用的正则表达式,轻松搞定各种验证场景

1,066 阅读4分钟

1. 18位身份证号

const idNumberRegex = /^[1-9]\d{5}(19|20)\d{2}(0\d|1[012])([012]\d|3[01])\d{3}[\dX]$/
  • ^[1-9]\d{5}:表示身份证归属地,以非零数字开头,后面接着5个任意数字
  • (19|20)\d{2}:表示年份,只能以19或20开头(我不信有18开头的),后面跟着2个数字
  • (0\d|1[012]):表示月份,取值范围为01到12
  • ([012]\d|3[01]):表示日期,取值范围为01到31,不同月份会有不同天数限制
  • \d{3}:表示一个顺序码,范围从001到999
  • [\dX]$:表示校验码,最后一个字符可能是数字也可能是大写字母X

2. 邮箱

各大邮箱服务提供商的用户名规则各不相同,我整理了以下几家常见的邮箱及其用户名规则:

  1. Gmail:6-30个字符,支持字母、数字和英文句点(.)
  2. Yahoo:4-32个字符,支持字母、数字、英文句点(.)和下划线(_)
  3. Outlook:1-64个字符,支持字母、数字、英文句点(.)、下划线(_)和减号(-)
  4. 163邮箱:6-18个字符,支持字母、数字和下划线(_)
  5. QQ邮箱:数字,与QQ号相同

鉴于这些邮箱提供商的规则存在差异,为了兼容它们,我们可以采用一个较为宽松的用户名匹配策略。取它们的共同特点,组成如下规则:用户名可包含字母、数字、英文句点(.)、下划线(_)和减号(-)。

const emailRegex = /^[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/
  • [a-zA-Z0-9._-]+:匹配用户名,由一个或多个字母、数字、英文句点(.)、下划线(_)和减号(-)组成
  • @:匹配邮箱地址中的 @ 符号
  • [A-Za-z0-9.-]+:匹配域名,由一个或多个字母、数字、英文句点(.)和减号(-)组成
  • \.:匹配邮箱地址中的点(.),需要进行转义
  • [A-Za-z]{2,}:匹配顶级域名,由两个及以上字母组成

测试结果:

emailRegex.test('305446081@qq.com') // true
emailRegex.test('pingzi@sina.com.cn') // true
emailRegex.test('ping-zi@163.com') // true

3. URL

const urlRegex = /^(http(s)?:\/\/)?([\w-]+\.)+[\w-]+(\/[\w-.\/?#%&=]*)?$/
  • (http(s)?:\/\/)? 表示可选的以 http:// 或 https:// 开头的部分
  • ([\w-]+\.)+ 表示至少匹配一段类似 xxx. 的域名部分,其中 \w 匹配任意字母或数字或下划线
  • [\w-]+ 表示匹配顶级域名,如 .com.cn.net 等
  • (\/[\w-.\/?#%&=]*)? 表示可选的路径和查询参数部分,其中 \/ 表示斜杠,[\w-.] 表示匹配任意字母、数字、中划线、小数点,[\/?#%&=]* 表示匹配任意数量的路径或查询参数字符

4. 域名(不包含协议)

const domainRegex = /^((?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$/
  • (?!-)(?<!-) 是断言,确保子域名部分不是以连字符(-)开头或结尾
  • [a-zA-Z0-9-]{1,63} 表示子域名,可以包含字母、数字和连字符,长度在 1 到 63 个字符之间
  • \. 表示匹配一个点号(.),用于分隔子域名
  • + 表示可以有一个或多个子域名部分
  • [a-zA-Z]{2,63} 表示顶级域名,由 2 到 63 个字母组成

5.电话号码(含座机和手机号)

const phoneRegex = /^((0\d{2,3}-\d{7,8})|(1[3-9]\d{9}))$/
  • (0\d{2,3}-\d{7,8}) 表示座机电话号码:
    • 0\d{2,3} 表示区号,以 0 开头,后跟 2 到 3 位数字
    • -\d{7,8} 表示电话号码,以连字符(-)分隔,后跟 7 到 8 位数字
  • (1[3-9]\d{9}) 表示手机号码:
    • 1 表示手机号码以数字 1 开头
    • [3-9] 表示号段,截止目前不存在1、2号段,所以只取3-9中的任意一位
    • \d{9} 表示手机号码后面 9 位是数字

6. 中文字符

const chineseRegex = /^[\u4e00-\u9fa5]+$/

7. 至少包含一个数字和一个字母

const letterNumberRegex = /^(?=.*[a-zA-Z])(?=.*\d).+$/
  • (?=.*[a-zA-Z]): 零宽度正向预测先行断言,表示后面必须包含至少一个英文字母
  • (?=.*\d): 零宽度正向预测先行断言,表示后面必须包含至少一个数字
  • .+: 匹配任意字符一次或多次,确保整个字符串不为空

8. 至少包含一个数字、一个大写字母和一个小写字母

const passwordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).+$/
  • (?=.*\d) 至少包含一个数字
  • (?=.*[a-z]) 至少包含一个小写字母
  • (?=.*[A-Z]) 至少包含一个大写字母
  • .+ 匹配任意字符至少一次

8. 高强度密码(至少包含数字、小写字母、大写字母、特殊字符,8位以上)

const strongPasswordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+,.?;:{}\[\]<>\\|~]).{8,}$/
  • (?=.*\d) 匹配至少一个数字
  • (?=.*[a-z]) 至少包含一个小写字母
  • (?=.*[A-Z]) 至少包含一个大写字母
  • (?=.*[!@#$%^&*()_+,.?;:{}\[\]<>\\|~]):至少包含一个特殊字符
  • .{8,} 至少包含 8 个字符

9. IP地址(IPv4)

const ipRegex = /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/
  • (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]):匹配 0-255 之间的数值
  • .: 匹配点号 (.)
  • {3}:表示前面的部分应重复三次,即匹配前三段 IP 地址
  • (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]):匹配最后一段 IP 地址

10. 邮编

const zipcodeRegex = /^[1-9]\d{5}$/ // 不以 0 开头的 6 位数字

11. QQ号

const qqRegex = /^[1-9][0-9]{4,10}$/ // 首位不能为0,长度在5~11位之间的数字

12. 微信号

规则:6~20个字符,只能包含字母、数字、下划线和减号,第一个字符必须为字母

const wechatRegex = /^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/
  • ^[a-zA-Z]:第一个字符必须为大小写字母中的任意一个
  • [a-zA-Z0-9_-]:表示接下来的字符可以是大小写字母、数字、下划线或减号中的任意一个
  • {5,19}:表示接下来的字符可以出现5到19次

13. 银行卡号

const bankCardRegex = /^\d{16}|\d{19}$/ // 16位或19位的数字

14. 车牌号(含普通+新能源+特殊车辆)

规则:车牌字母排除I和O,因为字母I容易和数字1混淆,字母O容易和数字0混淆且为公安专用

const carNumRegex = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/
  • [京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领] 表示匹配一个车牌号的第一个字符,它是各个省份的简称或者其他特殊车牌的前缀
  • [A-HJ-NP-Z] 表示匹配一个大写字母,作为车牌号的第二个字符,一般是城市代码。排除 I 和 O
  • [A-HJ-NP-Z0-9]{4,5} 表示匹配 4 到 5 个大写字母或数字,字母排除 I 和 O
  • [A-HJ-NP-Z0-9挂学警港澳] 表示匹配一个大写字母、数字或者特殊字符,作为车牌号的最后一个字符

测试结果:

carNumRegex.test('粤ZU82X港') // true-特殊
carNumRegex.test('鲁JB0699') // true-普通
carNumRegex.test('川SB110警') // true-特殊
carNumRegex.test('浙AD12345') // true-新能源
carNumRegex.test('晋E01666D') // true-新能源

15. 货币金额

const moneyRegex = /^\d{1,3}(?:,\d{3})*(\.\d+)?$/
  • ^\d{1,3} 表示以 1 到 3 位数字开头
  • (?:,\d{3})* 非捕获型分组,其中包含一个逗号和紧跟着的3个数字字符。*表示这个分组可以出现0次或多次。用来表示千位分隔符部分
  • (.\d+)? 捕获型分组,表示可选的小数部分,由小数点和至少一位数字构成

测试结果:

moneyRegex.test('123') // true
moneyRegex.test('1,234') // true
moneyRegex.test('12,345.6') // true
moneyRegex.test('123,456,789.00') // true
moneyRegex.test('1,23,456') // false
moneyRegex.test('123,45.67') // false

16. 匹配十六进制颜色值

const colorRegex = /^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
  • #:表示字符串以 # 开头
  • ([a-fA-F0-9]{6}|[a-fA-F0-9]{3}):表示匹配两种不同的长度格式
    • [a-fA-F0-9]{6} 用于匹配6位16进制颜色值
    • [a-fA-F0-9]{3} 用于匹配3位16进制颜色值(缩写形式)
    • | 表示这两种格式中的任意一种

测试结果:

colorRegex.test('#f00') // true
colorRegex.test('#00f3c4') // true
colorRegex.test('#12345') // false
colorRegex.test('#12g456') // false

17. 用户名

规则:长度为4-16个字符,可以包含汉字、字母、数字、下划线

const usernameRegex = /^[\u4e00-\u9fa5\w]{4,16}$/
  • [\u4e00-\u9fa5] :匹配一个汉字
  • \w :匹配一个字母、数字或下划线。相当于 [a-zA-Z0-9_]
  • {4,16}:由4-16个字符组成

测试结果:

usernameRegex.test('abc_123') // true
usernameRegex.test('我是瓶子') // true
usernameRegex.test('username_with_underscore') // false 长度超出限制
usernameRegex.test('vue@3') // false 含有特殊字符

18. 火车车次

规则:字母开头+数字,或者纯数字,最多不超过5个字符

  • G(高)-高铁
  • D(动车)-动车
  • Z(直)-直达特快
  • T(特)-特快列车
  • K(快)-快速列车
  • C(城)-城际列车
  • S(市)-市郊列车
  • L(临)-临时旅客列车
  • Y(游)-旅游列车
const trainNumberRegex = /^[GDZTKCSLY1-9]\d{1,4}$/

测试结果:

trainNumberRegex.test('6437') // true
trainNumberRegex.test('G2') // true
trainNumberRegex.test('K1190') // true
trainNumberRegex.test('T18') // true
trainNumberRegex.test('D712') // true

最后

期待您的宝贵意见!如果发现本文未涵盖的常见的正则验证场景,请在评论区留言。我将在后续迭代中补充相关内容,为大家提供更全面、实用的正则表达式。