正则表达式实战指南:开发者必备的文本处理利器
正则表达式(Regular Expression,简称 Regex)是一种强大的文本匹配工具,几乎所有编程语言和编辑器都支持。它语法简洁但功能强大,能在几行代码里完成几十行逻辑的文本处理工作。本文从核心语法到实战模式,带你系统掌握正则表达式。
一、为什么要学正则
正则表达式是开发者的瑞士军刀:
- 表单验证:邮箱、手机号、身份证、密码强度
- 文本提取:从日志、HTML、JSON 中提取特定信息
- 数据清洗:去空格、脱敏、格式转换
- 查找替换:编辑器中批量修改代码
- 路由匹配:URL 路径参数解析
掌握正则能大幅提升文本处理效率,省下的时间都是自己的。
二、核心语法速查
2.1 字符匹配
.:匹配除换行符外的任意单个字符\d:数字 [0-9]\w:单词字符 [a-zA-Z0-9_]\s:空白字符(空格、制表符、换行等)\D/\W/\S:对应小写的取反
2.2 位置锚点
^:字符串开头$:字符串结尾:单词边界\B:非单词边界
2.3 量词
*:0 次或多次+:1 次或多次?:0 次或 1 次{n}:恰好 n 次{n,}:至少 n 次{n,m}:n 到 m 次
2.4 分组与引用
(abc):捕获分组,可通过 、 反向引用(?:abc):非捕获分组,不保存匹配结果(?<name>abc):命名捕获分组
2.5 其他
[abc]:字符集,匹配其中任意一个[^abc]:否定字符集a|b:或,匹配 a 或 b(?=...):正向先行断言(?!...):负向先行断言
三、JavaScript 中的正则方法
3.1 正则对象方法
const regex = /pattern/flags;
// test:测试是否匹配,返回布尔值
regex.test(str);
// exec:执行匹配,返回匹配数组或 null
regex.exec(str);
3.2 字符串方法
// match:返回匹配结果数组
str.match(/pattern/);
// matchAll:返回所有匹配的迭代器(需 g 标志)
[...str.matchAll(/pattern/g)];
// replace:替换匹配内容
str.replace(/pattern/g, replacement);
// search:查找第一个匹配的索引
str.search(/pattern/);
// split:按正则分割字符串
str.split(/pattern/);
3.3 常用修饰符(flags)
g:全局匹配,找到所有匹配项i:忽略大小写m:多行模式,^ 和 $ 匹配每行的首尾s:让 . 匹配换行符
四、四大实用模式
4.1 邮箱验证
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test('user@example.com'); // true
注意:完全符合 RFC 5322 标准的邮箱正则极其复杂,实际项目中用上面这个简单版即可,真正的验证靠发确认邮件。
4.2 手机号验证(中国大陆)
const phoneRegex = /^1[3-9]\d{9}$/;
phoneRegex.test('13812345678'); // true
匹配以 1 开头,第二位 3-9,总共 11 位的手机号。
4.3 URL 匹配
const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
4.4 日期格式(YYYY-MM-DD)
const dateRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
dateRegex.test('2026-08-08'); // true
这个正则只能验证格式,不能验证日期有效性(比如 2026-02-30),还需要进一步用 Date 对象校验。
五、进阶技巧
5.1 贪婪与非贪婪
默认量词是贪婪的(匹配尽可能多的字符),加 ? 变为非贪婪:
const str = 'helloworld';
// 贪婪
str.match(/.*<\/div>/); // 匹配整个字符串
// 非贪婪
str.match(/.*?<\/div>/g); // 分别匹配两个div
5.2 捕获组与替换
// 将日期从 YYYY-MM-DD 转为 DD/MM/YYYY
const date = '2026-08-08';
date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1');
// "08/08/2026"
5.3 命名捕获组
const match = '2026-08-08'.match(/(?\d{4})-(?\d{2})-(?\d{2})/);
console.log(match.groups.year); // "2026"
六、性能优化与避坑
- 避免灾难性回溯:嵌套量词(如
(a+)+)在不匹配时可能导致指数级回溯
- 用具体字符代替 . :能用
\d 就不用 .,减少回溯
- 锚定开头:用
^ 锚定,避免从每个位置开始尝试
- 缓存正则:循环中使用的正则先编译好,不要每次创建
- 不要过度复杂:能用字符串方法解决的就不用正则,保持可读性
七、推荐工具
DevToolHub 提供了一个正则表达式测试工具,可以实时测试匹配结果,支持标志位切换和匹配高亮,非常适合调试正则。
总结
正则表达式是一项需要刻意练习的技能。刚开始可能觉得符号多、记忆量大,但用得多了就会发现它的规律。记住:正则的核心是模式匹配,把你想要匹配的模式拆解成字符、量词、位置,一步步构建出来。配合在线工具调试,很快就能上手。