🔍 正则表达式(Regular Expression)完全入门指南
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,能够用来 匹配、查找、替换 符合特定规则的字符串。无论是表单验证、日志分析、文本处理,还是代码重构,正则表达式都能大幅提升效率。本文将带你从零开始掌握正则表达式的核心语法和实战技巧。
🌐 什么是正则表达式?
正则表达式是一种 描述字符串模式 的形式化语言。你可以把它看作“字符串的搜索公式”。
🎯 典型应用场景
| 场景 | 示例 |
|---|---|
| 表单验证 | 验证邮箱、手机号、密码强度 |
| 文本搜索 | 在代码或日志中查找特定格式的内容 |
| 字符串替换 | 批量替换文本中的某些模式 |
| 数据提取 | 从一段文本中提取 URL、日期、IP 地址等 |
| 路由匹配 | 前端框架(如 Express、Vue Router)中的动态路由 |
🧩 基本语法:元字符与字符类
正则由 普通字符 和 元字符 组成。元字符具有特殊含义。
1. 常见元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c → 匹配 abc, a2c |
^ | 匹配字符串开头 | ^Hello → 匹配以 "Hello" 开头的字符串 |
$ | 匹配字符串结尾 | world$ → 匹配以 "world" 结尾的字符串 |
* | 匹配前一个字符 0 次或多次 | ab*c → 匹配 ac, abc, abbc |
+ | 匹配前一个字符 1 次或多次 | ab+c → 匹配 abc, abbc,但不匹配 ac |
? | 匹配前一个字符 0 次或 1 次 | https? → 匹配 http 或 https |
\ | 转义字符,使元字符失去特殊含义 | \. → 匹配真正的句号 . |
2. 字符类(Character Classes)
| 写法 | 含义 | 示例 |
|---|---|---|
[abc] | 匹配 a、b 或 c 中的任意一个 | [aeiou] → 匹配任意元音字母 |
[a-z] | 匹配 a 到 z 的任意小写字母 | [0-9] → 匹配任意数字 |
[^abc] | 匹配 非 a、b、c 的字符 | [^0-9] → 匹配非数字字符 |
\d | 匹配任意数字,等价于 [0-9] | \d{3} → 匹配 3 位数字 |
\w | 匹配字母、数字、下划线,等价于 [a-zA-Z0-9_] | \w+ → 匹配一个单词 |
\s | 匹配空白字符(空格、制表符、换行) | \s+ → 匹配一个或多个空白 |
\D、\W、\S | 分别是 \d、\w、\s 的反义 | \D+ → 匹配非数字字符串 |
📏 量词(Quantifiers)
用于指定匹配的次数。
| 量词 | 含义 | 示例 |
|---|---|---|
{n} | 精确匹配 n 次 | \d{4} → 匹配 4 位数字(如年份) |
{n,} | 至少匹配 n 次 | \d{2,} → 匹配 2 位或更多数字 |
{n,m} | 匹配 n 到 m 次 | \d{1,3} → 匹配 1-3 位数字(如 IP 段) |
* | 0 次或多次 | a* → 匹配 "", a, aa |
+ | 1 次或多次 | a+ → 匹配 a, aa,但不匹配 "" |
? | 0 次或 1 次 | colou?r → 匹配 color 或 colour |
🧩 分组与捕获
1. 分组 ( )
用括号 () 将多个字符组合成一个单元。
(https?)://([a-zA-Z0-9.-]+)
- 第一个分组
(https?):匹配http或https - 第二个分组
([a-zA-Z0-9.-]+):匹配域名
2. 捕获与引用
分组后可以用 \1, \2 等引用前面的匹配内容。
// 将 "2025-04-05" 替换为 "05/04/2025"
'2025-04-05'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1')
// 结果:'05/04/2025'
🔍 模式修饰符(Flags)
写在正则末尾,控制匹配行为。
| 修饰符 | 含义 |
|---|---|
g | 全局匹配(查找所有匹配,而非第一个) |
i | 忽略大小写 |
m | 多行模式(^ 和 $ 匹配每行的开头和结尾) |
s | 单行模式(. 可以匹配换行符) |
const text = "Hello world, hello regex";
text.match(/hello/); // 只匹配第一个
text.match(/hello/g); // 匹配所有:['hello', 'hello']
text.match(/hello/gi); // 忽略大小写全局匹配
✅ 实战案例:常用正则表达式
1. 验证邮箱
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
2. 验证手机号(中国大陆)
^1[3-9]\d{9}$
3. 验证密码强度(至少8位,含大小写字母、数字、特殊字符)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
4. 提取 URL 中的域名
https?:\/\/(?:[-\w.]++)\/
5. 匹配 IPv4 地址
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
💡 在 JavaScript 中使用正则
1. 创建正则对象
// 方式1:字面量
const regex = /hello/g;
// 方式2:构造函数
const regex = new RegExp('hello', 'g');
2. 常用方法
| 方法 | 说明 |
|---|---|
regex.test(str) | 返回 true/false,判断是否匹配 |
regex.exec(str) | 返回匹配结果数组(含分组) |
str.match(regex) | 返回所有匹配项 |
str.replace(regex, replacement) | 替换匹配内容 |
str.split(regex) | 按正则分割字符串 |
const pattern = /\d+/g;
const str = "Year: 2025, Month: 04";
str.match(pattern); // ['2025', '04']
str.replace(/\d+/g, 'X'); // "Year: X, Month: X"
🛠️ 正则调试工具推荐
- RegExr:regexr.com(实时测试、解释)
- Regex101:regex101.com(支持多种语言,详细分析)
- VS Code 插件:
Better Comments+ 正则高亮 - 浏览器控制台:直接测试
/.test()和.match()
⚠️ 使用建议与陷阱
| 建议 | 说明 |
|---|---|
| ✅ 先写注释 | 复杂正则建议用 RegExp 构造函数并加注释 |
| ✅ 分步测试 | 从小模式开始,逐步扩展 |
| ✅ 避免过度复杂 | 能用字符串方法解决的,不用正则 |
| ❌ 不要迷信正则 | HTML 解析、复杂语法分析不适合用正则 |
| ❌ 警惕回溯灾难 | 避免 (.*)* 这类可能导致性能崩溃的写法 |
📚 总结
正则表达式是每个开发者都应掌握的 文本处理利器。虽然初学时可能觉得晦涩,但一旦掌握,你将能:
- 快速验证用户输入
- 高效处理日志和文本
- 批量重构代码
- 提升自动化脚本能力
💡 学习建议:
- 从简单模式开始(如
\d+,\w+)- 多用在线工具调试
- 结合实际项目练习(如表单验证)
🔗 参考资料
- MDN 正则文档:developer.mozilla.org/zh-CN/docs/…
- 《精通正则表达式》—— Jeffrey Friedl(经典书籍)
- Regex Crossword:regexcrossword.com(游戏化学习)
📢 你在工作中用过哪些“神级”正则?欢迎在评论区分享!