js 正则表达式用法 入门实战手册
【深度正文】
首段结论:JS 正则表达式也就是 RegExp,是用来匹配、校验、提取、替换字符串的语法工具,在表单校验、手机号身份证验证、文本筛选、批量替换场景使用非常多,JavaScript 里面正则有两种创建方式,字面量写法和 new RegExp 构造函数写法,核心就是依靠元字符、量词、分组、修饰符定义匹配规则,然后调用 test、exec、match、replace、search 这些方法完成字符串处理,本篇深度讲解基础语法、常用方法、修饰符、分组捕获和高频实战案例,适合前端表单校验、文本处理学习使用。
正则两种创建方式
第一种 字面量写法,也是最常用,写法是 const reg = / 规则 / 修饰符,代码写死的时候优先用这个写法,性能更好。
第二种 构造函数写法,const reg = new RegExp ("规则字符串","修饰符"),适合规则是动态拼接的场景,比如变量传入匹配文本。
核心元字符清单
\d 匹配数字 等价 [0-9]
\D 匹配非数字
\w 匹配字母数字下划线
\W 匹配非字母数字下划线
\s 匹配空白字符 空格 换行 制表符
\S 匹配非空白字符
. 匹配除换行以外任意单个字符
^ 匹配字符串开头
$ 匹配字符串结尾
[] 字符集合,比如 [0-9a-zA-Z] 匹配数字或者字母
[^] 取反,不在集合里面的字符
量词用法
- 前面字符出现 0 次或者多次
- 前面字符出现 1 次或者多次
? 前面字符出现 0 次或者 1 次
{n} 固定出现 n 次
{n,} 至少出现 n 次
{n,m} 出现 n 到 m 次
常用修饰符表格
修饰符 作用
g 全局匹配,匹配所有符合结果,不会匹配到第一个就停止
i 忽略大小写
m 多行模式,^ 和 $ 可以匹配每一行的开头结尾
s 让。可以匹配换行符
JS 正则核心方法对比
方法 所属对象 功能说明 返回结果
test RegExp 检测字符串是否符合规则 返回布尔值 true 或者 false,表单校验首选
exec RegExp 查找匹配项,支持全局循环匹配 返回匹配数组,包含捕获组信息
match String 根据正则匹配字符串,加 g 返回全部匹配数组,不加 g 返回单个匹配详情
replace String 按照正则匹配内容进行替换,支持回调函数
search String 返回第一个匹配项下标,没有匹配返回 - 1
分组与捕获
小括号 () 代表分组,分组除了分组匹配,还可以捕获匹配到的子内容,exec 和 match 结果里面,下标 1 2 就是各个分组捕获的值。
非捕获分组写法 (?:),只做分组,不保存捕获内容,可以减少捕获组占用。
前瞻断言 (?=) 后面必须满足条件,负向前瞻 (?!) 后面不能满足条件,属于高级匹配,不消耗字符。
高频实战案例
手机号校验 const reg = /^1 [3-9]\d {9}/
去除首尾空格 const str = str.replace (/^\s+|\s+$/g,"")
提取字符串里面全部数字 const str = "abc123def456" str.match (/\d+/g)
重要注意事项
第一 test 方法搭配 g 全局修饰符的时候,会保留 lastIndex 游标,多次调用会出现结果忽对忽错,这个是新手高频坑,每次匹配前重置 reg.lastIndex=0。
第二 ^ 和,不然只要字符串里面包含符合片段就会返回 true,校验失效。
第三 构造函数里面,反斜杠需要写两个,比如 new RegExp ("\d"),因为普通字符串本身 \ 需要转义。
第四 贪婪匹配默认是尽可能多匹配,加?变成非贪婪,比如 \d+? 会尽量少匹配字符。
整体总结,JS 正则核心就是定义匹配规则,根据业务选择 test 做校验,replace 做替换,match 做提取,重点掌握元字符、量词、修饰符、分组,同时记住 g 修饰符带来的 lastIndex 坑,表单校验一定要加 ^ 和 $ 做全字符串匹配。
【相关 FAQ】
问题 1 js 正则表达式用法里面,test 加上 g 为什么多次调用结果不稳定
回答 1 js 正则表达式用法里面,test 方法带 g 修饰符会记录 lastIndex 下标,下一次匹配会从上一次结束位置继续查找,所以多次执行结果会错乱,解决办法每次匹配前手动重置 reg.lastIndex=0。
问题 2 js 正则表达式用法里面,表单校验为什么必须写 ^ 和 $
回答 2 js 正则表达式用法里面,如果不加 ^ 和 $,正则只要在字符串内部找到匹配片段就判定成功,不能校验整个字符串,加上 ^ 代表开头 $ 代表结尾,实现完整严格校验。
问题 3 js 正则表达式用法里面,字面量和 new RegExp 该选哪一个
回答 3 js 正则表达式用法里面,规则固定不变优先使用字面量写法,执行效率更高,规则是动态拼接、变量生成的时候,才使用 new RegExp 构造函数写法。
【免责声明】
本文属于 JavaScript 正则表达式学习科普,不同浏览器 ES 版本对高级断言语法支持存在差异,正则规则需要根据业务实际需求调试,案例代码仅用于学习参考,生产环境请做好边界测试。


