正则表达式教程
1. 什么是正则表达式?
正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找或替换文本中特定模式的工具。它通过定义一组规则来描述字符串的格式,广泛应用于文本处理、数据验证、日志分析等领域。
示例:
- 匹配邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - 匹配手机号:
^1[3-9]\d{9}$
2. 正则表达式基础语法
2.1 字符匹配
| 符号 | 说明 | 示例 | 匹配结果 |
|---|
. | 匹配任意单个字符(除换行符) | a.c | abc, aXc |
\d | 匹配数字(0-9) | \d{3} | 123, 456 |
\w | 匹配字母、数字或下划线 | \w+ | hello, a1_ |
\s | 匹配空白字符(空格、制表符等) | \s+ | , \t |
[abc] | 匹配括号内的任意一个字符 | [aeiou] | a, e, i |
[^abc] | 匹配不在括号内的字符 | [^0-9] | a, B, _ |
[a-z] | 匹配范围内的字符 | [A-Z] | A, B, Z |
2.2 量词(控制匹配次数)
| 符号 | 说明 | 示例 | 匹配结果 |
|---|
* | 匹配前一个字符 0 次或多次 | ab*c | ac, abc, abbc |
+ | 匹配前一个字符 1 次或多次 | ab+c | abc, abbc |
? | 匹配前一个字符 0 次或 1 次 | ab?c | ac, abc |
{n} | 匹配前一个字符恰好 n 次 | a{3} | aaa |
{n,} | 匹配前一个字符至少 n 次 | a{2,} | aa, aaa |
{n,m} | 匹配前一个字符 n 到 m 次 | a{1,3} | a, aa, aaa |
2.3 边界匹配
| 符号 | 说明 | 示例 | 匹配结果 |
|---|
^ | 匹配字符串开头 | ^Hello | Hello world |
$ | 匹配字符串结尾 | world$ | Hello world |
\b | 匹配单词边界 | \bcat\b | cat, a cat |
\B | 匹配非单词边界 | \Bcat\B | category |
2.4 分组与引用
| 符号 | 说明 | 示例 | 匹配结果 |
|---|
(abc) | 分组并捕获匹配内容 | (ab)+ | abab |
(?:abc) | 分组但不捕获(非捕获组) | (?:ab)+ | abab |
\1, \2 | 引用前面的分组(反向引用) | (\d)\1 | 11, 22 |
2.5 逻辑运算符
| 符号 | 说明 | 示例 | 匹配结果 |
|---|
| ` | ` | 或(匹配左边或右边) | `cat |
&& | 逻辑与(部分语言支持) | - | - |
3. 进阶技巧
3.1 贪婪与非贪婪匹配
- 贪婪模式(默认):尽可能多地匹配字符。
- 示例:
a.+b 匹配 aabab → 结果为 aabab。
- 非贪婪模式(加
?):尽可能少地匹配字符。
- 示例:
a.+?b 匹配 aabab → 结果为 aab。
3.2 零宽断言
- 正向先行断言
(?=...):匹配后面必须跟的内容。
- 示例:
\d+(?=px) 匹配 100px 中的 100。
- 负向先行断言
(?!...):匹配后面不能跟的内容。
- 示例:
\d+(?!px) 匹配 100pt 中的 100。
- 正向后行断言
(?<=...):匹配前面必须有的内容。
- 示例:
(?<=\$)\d+ 匹配 $100 中的 100。
- 负向后行断言
(?<!...):匹配前面不能有的内容。
- 示例:
(?<!\$)\d+ 匹配 100(非 $100)。
3.3 条件匹配
- 语法:
(?(条件)真分支|假分支)
- 示例:
(?(?=\d)\d+|[a-z]+) 匹配数字或字母。
3.4 递归匹配
- 部分语言支持递归(如 PCRE),用于匹配嵌套结构。
- 示例:
((\((?>[^()]+|(?1))*\))) 匹配嵌套括号。
4. 实际应用场景
4.1 数据验证
- 邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- URL:
^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$
4.2 文本提取
- 提取 HTML 标签内容:
<([a-z]+)[^>]*>(.*?)<\/\1>
- 提取日志中的 IP 地址:
\b(?:\d{1,3}\.){3}\d{1,3}\b
4.3 文本替换
- 将日期格式从
YYYY-MM-DD 改为 DD/MM/YYYY:
- 查找:
(\d{4})-(\d{2})-(\d{2}) - 替换:
$3/$2/$1
4.4 字符串分割
5. 常见工具与语言支持
| 工具/语言 | 正则表达式引擎 | 特点 |
|---|
| Notepad++ | PCRE | 支持递归、条件匹配 |
| Python | re 模块 | 简单易用,支持非贪婪匹配 |
| JavaScript | RegExp | 浏览器原生支持 |
| Perl | PCRE | 正则表达式“鼻祖” |
| Java | java.util.regex | 严格模式,需转义字符 |
6. 学习资源推荐
- 在线测试工具:
- 书籍:
- 《精通正则表达式》(Jeffrey Friedl)
- 文档:
7. 常见问题
- 为什么我的正则表达式不匹配?
- 检查是否开启多行模式(
^ 和 $ 的行为)。 - 确认是否转义特殊字符(如
* → \*)。
- 如何匹配跨行内容?
- 使用
[\s\S] 代替 .(如 <<[\s\S]*?>>)。
- 如何提高正则表达式性能?
总结:正则表达式是文本处理的瑞士军刀,掌握它能大幅提升效率。建议从简单场景入手,逐步学习进阶语法,并通过在线工具实践调试!