正则表达式教程 - 从零入门到常用语法(系统整理)
🌟 正则难在哪
正则被公认”看着像乱码”。但其实它是一套极简的语言:只有几十个符号,组合起来就能描述复杂模式。难的不是符号本身,而是”组合方式”和”优先级”。
本文按”由浅入深”的顺序,把核心概念讲清楚,并配大量示例。边学边练,用正则测试器最快。
一、正则是什么
正则(Regular Expression)是描述”一段文本长什么样”的表达式。比如 \d{3} 表示”3 个数字”。它主要用于四件事:查找、校验、提取、替换。
几乎所有编程语言和编辑器都支持正则,掌握一次,到处能用。
二、普通字符与转义
- 直接写
abc就是匹配abc; - 想匹配特殊符号本身,加反斜杠:
\.匹配真正的点号。
常见需要转义的字符:. + * ? ( ) [ ] { } ^ $ | \
例:匹配文件名里的点,用 \. 而不是 .(. 会匹配任意字符)。
三、字符类:一组可选项
| 写法 | 含义 |
|---|---|
[abc] | a、b 或 c 中任意一个 |
[a-z] | 小写字母 |
[A-Za-z] | 任意英文字母 |
[^abc] | 除 a、b、c 之外 |
\d | 数字 |
\D | 非数字 |
\w | 字母数字下划线 |
\s | 空白 |
例:[A-Za-z0-9_] 等价于 \w。
四、量词:重复几次
| 量词 | 含义 |
|---|---|
* | 0 次或多次 |
+ | 1 次或多次 |
? | 0 或 1 次 |
{3} | 恰好 3 次 |
{2,5} | 2 到 5 次 |
{2,} | 至少 2 次 |
例:\d{3} 匹配 3 位数字;\w+ 匹配一个或多个单词字符。
贪婪 vs 懒惰
- 贪婪(默认):尽量多匹配;
- 懒惰:加
?,尽量少匹配。
对 <a><b> 用 <.+> 会匹配整个 <a><b>;用 <.+?> 只匹配 <a>。
五、分组与捕获
(abc):捕获组,把匹配到的内容单独取出;(?:abc):非捕获组,只分组不捕获;(?<name>abc):命名组,便于按名取值。
例:(\d{4})-(\d{2})-(\d{2}) 可分别取出年、月、日。
反向引用:\1 引用第 1 组,如 \b(\w+)\s+\1\b 匹配重复单词。
六、锚点:匹配位置
| 锚点 | 含义 |
|---|---|
^ | 开头 |
$ | 结尾 |
\b | 单词边界 |
例:^\d+$ 表示”整串都是数字”;\bcat\b 只匹配独立的 cat,不匹配 category。
七、或与分支
cat|dog 匹配 cat 或 dog;配合分组 (cat|dog)s 匹配 cats 或 dogs。
注意分支的顺序:(a|ab) 对 ab 会先匹配 a。需要长优先时把长的放前面。
八、断言:前后条件
| 写法 | 含义 |
|---|---|
(?=x) | 后面是 x(前瞻) |
(?!x) | 后面不是 x(负前瞻) |
(?<=x) | 前面是 x(后顾) |
(?<!x) | 前面不是 x(负后顾) |
例:密码”至少一个数字”可用 (?=.*\d) 前瞻。详见正则前瞻与后顾怎么用。
九、Flags:匹配开关
| Flag | 作用 |
|---|---|
i | 忽略大小写 |
g | 全局 |
m | 多行 |
s | . 匹配换行 |
u | Unicode |
详见正则 Flags 详解。
十、实战练习(自己动手)
在正则测试器里试:
| 题目 | 参考答案 |
|---|---|
| 匹配 11 位手机号 | ^1[3-9]\d{9}$ |
| 匹配邮箱 | [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} |
| 匹配 YYYY-MM-DD | ^\d{4}-\d{2}-\d{2}$ |
| 提取所有 URL | https?://[^\s]+ |
| 匹配中文 | [\u4e00-\u9fa5]+ |
| 匹配整数或小数 | ^-?\d+(\.\d+)?$ |
| 去掉 HTML 标签 | <[^>]+> |
交换 a b 为 b a | ^(\w+)\s+(\w+)$ → $2 $1 |
十一、常见错误
- 忘转义:
.+被当特殊符号; - 忘
g:只匹配第一处; - 贪婪过头:
.*吃掉太多,改用.*?; ^$只匹配整串:多行要开m;.不匹配换行:开s或用[\s\S];- 灾难性回溯:
(a+)+这类写法要避免,见 ReDoS; - 组编号错位:加一个括号,后面组号顺延,建议用命名组。
十二、学习路径建议
- 先掌握字符类 + 量词 + 锚点(够用 80%);
- 再学分组的捕获与引用;
- 然后断言与 Flags;
- 最后了解各语言差异(多语言引擎)。
遇到看不懂的正则,用正则解释器拆解;需要速查用正则语法速查表。
❓ 常见问题(FAQ)
正则要背吗?
不用背。理解分类,常用时查[正则语法速查](https://www.xingdian.net/blog/posts/regex-cheatsheet/)即可。怎么练最快?
在[正则测试器](https://www.xingdian.net/app/regex/tester/)里边写边看结果,比看书快得多。看不懂别人的正则?
用[正则解释器](https://www.xingdian.net/app/regex/explain/)逐段拆解,或用[正则可视化](https://www.xingdian.net/app/regex/visualize/)看结构。贪婪和懒惰怎么选?
默认贪婪;需要"匹配到最近的位置"时用懒惰(加 `?`)。各语言语法一样吗?
基础通用,命名组、Flags、断言有差异,见[多语言引擎](https://www.xingdian.net/app/regex/engines/)。学习正则需要多久?
掌握 80% 常用语法,认真练一两天即可;深入断言/性能优化需要更多实践。正则能替代解析器吗?
不适合解析复杂嵌套结构(如完整 HTML/JSON),这类场景用专门解析器更稳。有推荐的练习顺序吗?
按本文"实战练习"表逐题做,再尝试用[常用格式正则](https://www.xingdian.net/app/regex/formats/)里的规则反推写法。十三、优先级与常见组合
正则也有”优先级”,理解它才能读懂复杂表达式:
- 转义最高(
\.就是一个字符); - 字符类/分组其次(
[...]、(...)); - 量词作用在紧邻的元素上(
ab+=a+b+); - 连接(
abc表示 a 后接 b 后接 c); - 分支
|优先级最低(ab|cd=ab或cd)。
常见组合:
| 目标 | 写法 |
|---|---|
| 非空任意行 | ^.+$ |
| 整数或小数 | ^-?\d+(\.\d+)?$ |
| 中英文数字 | ^[\u4e00-\u9fa5A-Za-z0-9]+$ |
| 日期时间 | ^\d{4}-\d{2}-\d{2}( \d{2}:\d{2})?$ |
| 带引号字符串 | "[^"]*" |
十四、进阶主题(了解即可)
- 原子组与占有量词:
(?>...)、a++,减少回溯; - 条件匹配:
(?(1)yes|no),部分引擎支持; - 递归:PCRE 支持
(?R),可匹配嵌套结构; - Unicode 属性:
\p{Script=Han}匹配中文,\p{Emoji}匹配表情; - 粘性匹配:JS 的
y标志,用于逐段解析。
这些语法各引擎支持不一,迁移时用多语言引擎核对。
十五、正则 vs 通配符
- 通配符(
*、?):只用于文件名匹配,简单; - 正则:功能完整,支持分组、量词、断言、回溯引用。
例:通配符 *.txt 只能匹配文件名;正则 \w+\.txt$ 可精确控制。
十六、正则能做什么、不能做什么
适合:格式校验、文本查找替换、简单提取、日志解析。
不适合:解析嵌套结构(完整 HTML/JSON/XML)、复杂语法分析——这些用专门解析器更稳。正则会因嵌套而产生回溯问题。
💬 总结
正则的核心就三块:字符(匹配什么)、量词(几次)、位置(哪里),再加分组与断言。按本文顺序学,配合正则测试器多练,很快上手。
立即体验:访问 学习与参考
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时