正则表达式
💡 学习指南:正则表达式看起来像天书?其实它只是一种"描述文本模式"的迷你语言。本章带你从零开始理解正则的核心思想,学会用几个关键符号解决 80% 的文本搜索和验证问题。
0. 你为什么需要正则表达式?
想象以下场景:
- 从一大段日志里找出所有 IP 地址
- 验证用户输入的邮箱格式是否合法
- 把文本中所有的日期格式从
2024/01/15替换为2024-01-15 - 从网页源码中提取所有链接
用普通字符串搜索? 你需要写一大堆 if-else 判断逻辑。
用正则表达式? 一行模式搞定。
1. 正则入门:三分钟上手
👇 动手点点看:输入正则表达式,实时查看匹配结果
正则表达式:文本的搜索引擎模式匹配 · 分组捕获 · 实时预览
//
匹配结果3 个匹配
我的手机号是 13812345678,座机是 010-12345678,邮箱是 test@example.com
#1
"13812345678"#2
"010"#3
"12345678"试试预设:
核心思想:正则表达式是一种用特殊符号描述文本模式的语言,在搜索、替换、数据验证中无处不在。
💡 一句话理解
正则表达式 = 用特殊符号描述"你想找什么样的文本"。\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
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')
// truePython
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. 总结
📚 核心要点
- 正则 = 描述文本模式的迷你语言,用于搜索、匹配、替换
- 三类积木:字符类(匹配什么)+ 量词(匹配几次)+ 位置/分组
- \d \w \s 是最常用的三个字符类,覆盖数字、单词、空白
- 不需要从零写:常见场景都有成熟的正则模式可以复用
- 贪婪 vs 懒惰:默认贪婪(多匹配),加
?变懒惰(少匹配)
下一步学习:
- 环境变量与 PATH - 理解系统配置
- SSH 与密钥认证 - 安全连接远程服务器
