正则表达式
1. 正则表达式是什么
正则表达式(Regular Expression,简称 regex)是一种描述文本模式的”语言”。它回答一个简单的问题:
这段文本是否符合某种模式?
你不需要把它当成一门编程语言来背。它更像是一种”模式描述符”:用简短符号告诉计算机你要找什么样的文本。工程上真正重要的是判断它适不适合这个问题、能不能被验证、会不会误伤边界。
适用场景:
- 数据验证:用户输入的邮箱、手机号格式对不对?
- 文本搜索替换:批量替换日志中的日期格式
- 日志解析:从一堆日志行中提取 IP 地址、时间戳
- 代码重构:IDE 中用正则批量替换函数名
几乎所有主流编程语言都内置了正则支持:Python、JavaScript、Java、Go、Rust……学会核心思想,你就能在任何语言中使用它。
2. 核心思想:三个基本操作
正则的本质只有三种操作。所有复杂的正则表达式,都是这三种操作的组合。
匹配字符
最基本的操作——描述你要匹配的字符:
a匹配字母 a 本身\d匹配任意数字(0-9).匹配任意字符(除换行外)
你不需要记住所有转义字符。知道 \d 是数字、\w 是单词字符、\s 是空白,就够用了。
重复
描述一个字符或模式出现多少次:
| 符号 | 含义 | 示例 |
|---|---|---|
* | 0 次或多次 | a* 匹配 ""、“a”、“aaa” |
+ | 1 次或多次 | a+ 匹配 “a”、“aaa”,不匹配 "" |
? | 0 或 1 次 | a? 匹配 "" 或 “a” |
{n,m} | n 到 m 次 | \d{3,5} 匹配 3 到 5 位数字 |
分组与选择
把多个字符组合在一起,或者提供多个选项:
(abc)分组:把abc当作一个整体,可以对其应用重复操作,如(abc)+[abc]字符集:匹配 a、b、c 中的任意一个字符|或运算:cat|dog匹配 “cat” 或 “dog”
关键理解: 括号 ( ) 有两种用途——分组和捕获。分组是把多个字符当作一个整体;捕获是记住匹配到的内容,后续可以引用。
3. 常用模式速查
你不需要背诵完整的元字符表。以下是实际开发中最常用的 10 个模式:
| 模式 | 说明 | 示例 |
|---|---|---|
\d+ | 一个或多个数字 | 123 |
\w+ | 一个或多个字母、数字、下划线 | hello_world |
[a-zA-Z]+ | 一个或多个英文字母 | Hello |
\s+ | 一个或多个空白字符 | 空格、Tab、换行 |
^...$ | 行首到行尾(精确匹配) | ^hello$ 只匹配 “hello” |
(...) | 捕获组 | (hello) (world) 捕获两组 |
.*? | 懒惰匹配(尽量少匹配) | <p>(.*?)</p> 匹配标签内容 |
\b\w+\b | 匹配一个完整单词 | 单词边界,不会匹配到单词中间 |
[^...] | 排除字符集 | [^0-9] 匹配非数字字符 |
(?=...) | 前瞻断言(不消耗字符) | \d+(?=元) 匹配”100 元”中的 100 |
4. 贪婪 vs 懒惰
这是正则最重要、也最容易出错的概念。
贪婪匹配(默认行为): 量词会尽可能多地匹配字符。
懒惰匹配: 在量词后加 ?,让它尽可能少地匹配。
用一个 HTML 标签的例子来说明:
文本:<p>第一段</p><p>第二段</p>
贪婪:<p>(.*)</p>
→ 匹配:"第一段</p><p>第二段"
→ 原因:.* 吃掉了中间所有内容,直到最后一个 </p>
懒惰:<p>(.*?)</p>
→ 匹配:"第一段"
→ 原因:.*? 遇到第一个 </p> 就停止经验法则: 当你想匹配”两个标记之间的内容”时,几乎总是需要懒惰匹配 .*?。
5. 常用场景与模板
以下是实际开发中经常用到的正则模板。它们适合搜索、提取和轻量校验,不适合替代完整解析器:
邮箱验证(简化版)
[\w.-]+@[\w.-]+\.\w+匹配 [email protected]、[email protected]。注意:RFC 5322 的完整邮箱正则极其复杂,实际项目中建议用专门的验证库,这个简化版用于日常场景足够。
手机号验证(中国大陆)
1[3-9]\d{9}匹配 11 位手机号,第二位是 3-9(覆盖现有号段)。
URL 提取
https?://[\w./-]+匹配 http:// 或 https:// 开头的 URL。适合从文本中提取链接。
日志时间提取
\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}匹配 2026-05-09 14:30:00 格式的时间戳。
6. AI 时代的正则表达式
在 AI 时代,你不需要记忆复杂的正则语法。大模型可以根据自然语言描述生成正则表达式,但它生成的是候选方案,不是事实。
但你需要具备两个核心能力:
- 读懂正则:AI 生成的正则不一定正确,你需要能看懂它,判断是否符合你的需求
- 描述需求:你能越准确地描述”我要匹配什么”,AI 生成的结果就越准确
核心能力的转变:
过去:手写正则 -> 调试 -> 调试 -> 调试
现在:描述需求 -> AI 生成候选 -> 用样例验证 -> 收窄边界使用原则:
- 准备正例和反例,不只测试“应该匹配”的文本,也测试“不应该匹配”的文本。
- 能用结构化解析器时,不要用正则硬解析 HTML、JSON、YAML 或复杂语言语法。
- 把正则写进脚本或生产逻辑前,留下注释说明目标格式和已知边界。
- 用 regex101.com 这类工具逐符号检查含义,尤其是分组、贪婪匹配和断言。
7. 延伸阅读
- regex101 — 在线正则测试和学习工具
- Regulex — 正则可视化工具
- Regex Learn — 交互式正则学习