正则表达式从入门到实战: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]*  代替 .* (匹配所有字符包括换行)

动手练习

工具库正则测试工具完成以下练习:

  1. 从"我的电话是138-1234-5678,办公室电话010-12345678"中提取所有电话号码
  2. 将"2026-06-03"替换为"06/03/2026"
  3. 找出文本中所有重复的单词

完成这3个练习,你就算正则入门了。搭配文本替换文本对比功能,你的文本处理能力会上一个大台阶。

本站提供浏览器本地工具,免注册即可试用 →

#正则表达式#Regex#文本处理#编程入门#开发工具