正则表达式

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 时代,你不需要记忆复杂的正则语法。大模型可以根据自然语言描述生成正则表达式,但它生成的是候选方案,不是事实。

但你需要具备两个核心能力:

  1. 读懂正则:AI 生成的正则不一定正确,你需要能看懂它,判断是否符合你的需求
  2. 描述需求:你能越准确地描述”我要匹配什么”,AI 生成的结果就越准确

核心能力的转变:

过去:手写正则 -> 调试 -> 调试 -> 调试
现在:描述需求 -> AI 生成候选 -> 用样例验证 -> 收窄边界

使用原则:

  • 准备正例和反例,不只测试“应该匹配”的文本,也测试“不应该匹配”的文本。
  • 能用结构化解析器时,不要用正则硬解析 HTML、JSON、YAML 或复杂语言语法。
  • 把正则写进脚本或生产逻辑前,留下注释说明目标格式和已知边界。
  • regex101.com 这类工具逐符号检查含义,尤其是分组、贪婪匹配和断言。

7. 延伸阅读