💡 学习指南:正则表达式看起来像天书?其实它只是一种"描述文本模式"的迷你语言。本章带你从零开始理解正则的核心思想,学会用几个关键符号解决 80% 的文本搜索和验证问题。


0. 你为什么需要正则表达式?

想象以下场景:

  • 从一大段日志里找出所有 IP 地址
  • 验证用户输入的邮箱格式是否合法
  • 把文本中所有的日期格式从 2024/01/15 替换为 2024-01-15
  • 从网页源码中提取所有链接

用普通字符串搜索? 你需要写一大堆 if-else 判断逻辑。
用正则表达式? 一行模式搞定。


1. 正则入门:三分钟上手

👇 动手点点看:输入正则表达式,实时查看匹配结果

💡 一句话理解

正则表达式 = 用特殊符号描述"你想找什么样的文本"\d 代表数字,+ 代表一个或多个,所以 \d+ 就是"一个或多个数字"。


2. 核心概念:像搭积木一样组合

正则的本质是用三类积木搭出你想要的模式:

2.1 积木一:字符类(匹配什么字符)

语法 含义 示例
. 任意字符 a.c → abc, a1c, a c
\d 数字 [0-9] \d\d → 42, 99
\w 字母/数字/下划线 \w+ → hello, user_1
\s 空白字符 匹配空格、Tab
[abc] 集合中的任意一个 [aeiou] → 元音字母
[^abc] 不在集合中的 [^0-9] → 非数字字符

2.2 积木二:量词(匹配几次)

语法 含义 示例
* 0 次或多次 ab* → a, ab, abbb
+ 1 次或多次 ab+ → ab, abbb(不匹配 a)
? 0 次或 1 次 colou?r → color, colour
{3} 恰好 3 次 \d{3} → 123
{2,4} 2 到 4 次 \d{2,4} → 12, 1234

2.3 积木三:位置和分组

语法 含义 示例
^ 行首 ^Hello → 以 Hello 开头的行
$ 行尾 end$ → 以 end 结尾的行
\b 单词边界 \bcat\b → cat(不匹配 catch)
(...) 捕获分组 (\d+)-(\d+) → 分别捕获
a|b cat|dog → cat 或 dog

3. 实战:常见验证模式

3.1 邮箱验证

  [\w.+-]+@[\w-]+\.[\w.]+
  

拆解:

  • [\w.+-]+ — 用户名部分(字母数字点加号横杠)
  • @ — 字面量 @
  • [\w-]+ — 域名部分
  • \. — 转义的点
  • [\w.]+ — 顶级域名

3.2 手机号验证(中国)

  1[3-9]\d{9}
  

拆解:

  • 1 — 以 1 开头
  • [3-9] — 第二位是 3-9
  • \d{9} — 后面跟 9 位数字

3.3 密码强度检查

  ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
  

拆解:

  • (?=.*[a-z]) — 至少一个小写字母(前瞻断言)
  • (?=.*[A-Z]) — 至少一个大写字母
  • (?=.*\d) — 至少一个数字
  • .{8,} — 总长度至少 8 位

4. 在代码中使用正则

JavaScript

  const text = '联系方式:13812345678 或 15099887766'
const regex = /1[3-9]\d{9}/g
const phones = text.match(regex)
// ['13812345678', '15099887766']

// 替换
text.replace(/\d{4}(?=\d{4}$)/, '****')
// 隐藏手机号中间四位

// 验证
/^[\w.+-]+@[\w-]+\.[\w.]+$/.test('user@example.com')
// true
  

Python

  import re

text = '价格是 99 元,优惠 20 元'
numbers = re.findall(r'\d+', text)
# ['99', '20']

# 替换
re.sub(r'\d+', 'X', text)
# '价格是 X 元,优惠 X 元'

# 分组捕获
match = re.search(r'(\d+)-(\d+)', '2024-01-15')
match.group(1)  # '2024'
match.group(2)  # '01'
  

5. 贪婪 vs 懒惰:一个关键区别

  文本: <b>hello</b> and <b>world</b>
  
模式 匹配结果 说明
<b>.*</b> <b>hello</b> and <b>world</b> 贪婪:尽量多匹配
<b>.*?</b> <b>hello</b> 懒惰:尽量少匹配
💡 记住

默认是贪婪模式。在量词后面加 ? 变成懒惰模式。大多数时候,你需要的是懒惰模式。


6. 总结

📚 核心要点
  1. 正则 = 描述文本模式的迷你语言,用于搜索、匹配、替换
  2. 三类积木:字符类(匹配什么)+ 量词(匹配几次)+ 位置/分组
  3. \d \w \s 是最常用的三个字符类,覆盖数字、单词、空白
  4. 不需要从零写:常见场景都有成熟的正则模式可以复用
  5. 贪婪 vs 懒惰:默认贪婪(多匹配),加 ? 变懒惰(少匹配)

下一步学习

Last updated 26 Apr 2026, 03:21 +0800 . history