正则表达式从入门到实战:30分钟掌握文本处理利器
开发教程
为什么要学正则?
一行正则表达式可以替代20行字符串处理代码。
假设你要从1000行日志中提取所有IP地址。用普通代码——分割字符串、遍历、判断格式——至少20行。用正则:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3},一行搞定。
这篇教程假设你完全零基础,30分钟后你就能处理日常80%的文本匹配需求。
基础语法
字面字符和元字符
| 字符 | 含义 | 示例 |
|---|---|---|
abc |
精确匹配"abc" | hello → 匹配"hello" |
. |
任意单个字符(除换行) | h.t → hat, hot, hit |
\d |
数字 [0-9] | \d{3} → 123, 456 |
\w |
单词字符 [a-zA-Z0-9_] | \w+ → hello, test123 |
\s |
空白字符(空格、Tab、换行) | a\sb → "a b" |
\D |
非数字 | \D+ → hello |
\W |
非单词字符 | \W → @, #, ! |
量词
| 量词 | 含义 | 示例 |
|---|---|---|
* |
0次或多次 | ab*c → ac, abc, abbc |
+ |
1次或多次 | ab+c → abc, abbc(不含ac) |
? |
0次或1次 | colou?r → color, colour |
{n} |
恰好n次 | \d{4} → 四位数 |
{n,} |
至少n次 | \d{4,} → 至少四位数 |
{n,m} |
n到m次 | \d{3,5} → 三到五位数 |
字符类
[a-z] 小写字母
[A-Z] 大写字母
[0-9] 数字
[a-zA-Z] 所有字母
[^0-9] 非数字(^在[]内表示"非")
[abc] 匹配a或b或c
锚点
| 锚点 | 含义 | 示例 |
|---|---|---|
^ |
行首 | ^Hello → 以Hello开头的行 |
$ |
行尾 | world$ → 以world结尾的行 |
\b |
单词边界 | \bcat\b → 匹配独立的cat,不匹配catch |
分组和捕获
(\d{3})-(\d{4})-(\d{4}) 匹配手机号 138-0000-1111
$1 = 138, $2 = 0000, $3 = 1111
在工具库正则工具中使用替换功能:$1****$3 可以将中间四位脱敏为 138-****-1111。
非捕获分组
(?:\d{3}) 只分组不捕获,不产生$1/$2
零宽断言(进阶)
| 语法 | 含义 | 示例 |
|---|---|---|
(?=...) |
后面跟着... | \d+(?=元) → 匹配"100元"中的100 |
(?!...) |
后面不跟着... | \d+(?!元) → 不匹配"100元"中的100 |
(?<=...) |
前面是... | (?<=¥)\d+ → 匹配"¥100"中的100 |
(?<!...) |
前面不是... | (?<!¥)\d+ → 不匹配"¥100"中的100 |
实用正则配方
邮箱: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
手机号: 1[3-9]\d{9}
URL: https?://[^\s/$.?#].[^\s]*
身份证: \d{17}[\dXx]
中文: [\u4e00-\u9fa5]
IP地址: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
日期: \d{4}-\d{2}-\d{2}
常见陷阱
1. 贪婪 vs 懒惰
贪婪: <.*> 匹配"<div>hello</div>" → 整个字符串(贪心)
懒惰: <.*?> 匹配"<div>hello</div>" → 只匹配<div>和</div>
加 ? 让量词变懒惰。
2. 灾难性回溯
# 危险写法
(a+)+b 匹配"aaaaaaaaaaaaaaaaaaaa" → 性能爆炸
# 安全写法
a+b 简单明确,不嵌套量词
3. . 不匹配换行符
# 匹配多行内容
[\s\S]* 代替 .* (匹配所有字符包括换行)
动手练习
用工具库正则测试工具完成以下练习:
- 从"我的电话是138-1234-5678,办公室电话010-12345678"中提取所有电话号码
- 将"2026-06-03"替换为"06/03/2026"
- 找出文本中所有重复的单词
本站提供浏览器本地工具,免注册即可试用 →
#正则表达式#Regex#文本处理#编程入门#开发工具