正则表达式入门教程:从零到实战
最后更新:2026年5月 · 阅读时间:15分钟
什么是正则表达式?
正则表达式(Regular Expression,简称 Regex)是一种描述字符串模式的语言。它用特殊语法定义搜索模式,用于匹配、查找、替换文本。
正则表达式广泛应用于:
- 表单验证:邮箱、手机号、密码强度校验
- 文本提取:从日志中提取关键信息
- 批量替换:代码重构中的查找替换
- 爬虫解析:从 HTML 中提取数据
基础语法
普通字符
普通字符匹配自身:
/hello/ → 匹配 "hello world" 中的 "hello"
元字符
元字符有特殊含义,是正则表达式的核心:
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意字符(除换行符) | a.c → abc, a1c, a c |
\d | 数字 [0-9] | \d{3} → 123, 456 |
\D | 非数字 [^0-9] | \D+ → abc, hello |
\w | 单词字符 [a-zA-Z0-9_] | \w+ → hello_123 |
\W | 非单词字符 | \W → @, #, 空格 |
\s | 空白字符(空格、制表、换行) | a\sb → a b |
\S | 非空白字符 | \S+ → hello |
字符类
用方括号定义字符集合:
[abc] → 匹配 a 或 b 或 c [a-z] → 匹配任意小写字母 [A-Z0-9] → 匹配大写字母或数字 [^abc] → 匹配除 a、b、c 外的任意字符
量词
量词控制匹配的重复次数:
| 量词 | 含义 | 示例 |
|---|---|---|
* | 0 次或多次 | ab*c → ac, abc, abbc |
+ | 1 次或多次 | ab+c → abc, abbc |
? | 0 次或 1 次 | colou?r → color, colour |
{n} | 恰好 n 次 | \d{4} → 4位数字 |
{n,} | 至少 n 次 | \d{2,} → 2位及以上数字 |
{n,m} | n 到 m 次 | \d{3,5} → 3到5位数字 |
贪婪 vs 非贪婪
默认量词是贪婪的,会匹配尽可能多的字符。在量词后加 ? 变为非贪婪(懒惰)模式:
// 贪婪 /".*"/ → "hello" world" 匹配 "hello" world" // 非贪婪 /".*?"/ → "hello" world" 只匹配 "hello"
分组与引用
捕获组
用 () 创建捕获组,可以提取匹配的子串:
/(\d{4})-(\d{2})-(\d{2})/ → 2026-05-20
组1: 2026 组2: 05 组3: 20
非捕获组
用 (?:) 创建非捕获组,不保存匹配结果:
/(?:http|https):\/\/.*/ → 匹配URL但不捕获协议
反向引用
用 \1、\2 引用前面的捕获组:
/(\w)\1/ → 匹配重复字符,如 aa, bb, 11
锚点与边界
| 符号 | 含义 | 示例 |
|---|---|---|
^ | 字符串开头 | ^Hello → 以Hello开头 |
$ | 字符串结尾 | world$ → 以world结尾 |
\b | 单词边界 | \bcat\b → 单词cat |
\B | 非单词边界 | \Bcat\B → scatter中的cat |
提示:^ 在字符类 [^...] 中表示"取反",在字符类外表示"开头"。
零宽断言
零宽断言只判断条件,不消耗字符:
| 语法 | 名称 | 含义 |
|---|---|---|
(?=...) | 正向前瞻 | 后面必须匹配 |
(?!...) | 负向前瞻 | 后面必须不匹配 |
(?<=...) | 正向后瞻 | 前面必须匹配 |
(?<!...) | 负向后瞻 | 前面必须不匹配 |
示例
// 匹配数字后面的单位 /\d(?=px)/ → "100px" 匹配 1、0、0(每个数字后跟px) // 匹配不以 http 开头的 URL /^(?!http).*/ → 不以http开头的字符串 // 匹配 $ 符号前面的数字 /(?<=\$)\d+/ → "$100" 匹配 100
常用正则示例
| 用途 | 正则表达式 |
|---|---|
| 邮箱 | ^[\w.-]+@[\w-]+\.[\w.]+$ |
| 手机号(中国大陆) | ^1[3-9]\d{9}$ |
| 身份证号 | ^\d{17}[\dXx]$ |
| IP 地址 | ^\d{1,3}(\.\d{1,3}){3}$ |
| URL | ^https?://[\w.-]+\.[a-z]{2,}(/\S*)?$ |
| 中文 | [一-龥]+ |
| 邮政编码 | ^\d{6}$ |
| HTML 标签 | <(\w+)[^>]*>.*?</\1> |
| 日期 YYYY-MM-DD | \d{4}-\d{2}-\d{2} |
| 密码强度(8位+大小写+数字+特殊) | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$ |
常见问题
正则表达式应该加 ^ 和 $ 吗?
如果需要完全匹配(如表单验证),必须加 ^ 和 $。否则正则只要求字符串中包含匹配即可。例如 /\d{11}/ 会匹配 "abc12345678900xyz" 中的 11 位数字。
如何匹配换行符?
默认 . 不匹配换行符。在 JavaScript 中使用 s 标志:/regex/s,或使用 [\s\S] 代替 .。
正则表达式性能如何优化?
- 避免嵌套量词,如
/(a+)+/容易导致灾难性回溯 - 使用非捕获组
(?:)替代捕获组() - 尽量用具体字符代替
. - 使用锚点
^$缩小匹配范围
提示:使用我们的在线正则测试器可以实时测试正则表达式的匹配结果,边学边练。