写正则写到一半忘了 \b 是什么?或者写出来明明看着对,跑起来就是没匹配?这篇给你一份实战速查表——按元字符、量词、分组、真实样例 4 块组织,每个细节配一句人话解释。配合 Piick 正则测试工具 用,边查边测。
元字符速查表
正则里所有「不是字面字符」的特殊符号统称元字符。最常用的 12 个:
.任意单字符(默认不匹配换行,加sflag 才匹配)^行首(多行模式下匹配每行开头)$行尾(多行模式下匹配每行结尾)\b单词边界(单词字符\w和非\w之间)\d数字,等价[0-9]\D非数字\w单词字符,等价[A-Za-z0-9_]\W非单词字符\s空白字符(空格、Tab、换行)\S非空白[abc]字符类,匹配 a/b/c 任一[^abc]反向字符类,匹配不是 a/b/c 的字符
记忆技巧:d 是 digit,w 是 word,s 是 space——大写就是「非」。
量词:贪婪 vs 非贪婪
量词控制前一个元素出现几次:
*0 次或多次+1 次或多次?0 次或 1 次{n}恰好 n 次{n,}至少 n 次{n,m}n 到 m 次
关键陷阱:默认是贪婪匹配,会尽可能多吃。比如用 ".*" 匹配 "a" and "b" 会得到整串 "a" and "b",而不是两段。加 ? 变成非贪婪:".*?" 才能拿到 "a" 和 "b" 两段。
调试正则时,怀疑匹配太贪,第一个动作就是加 ?。
分组与捕获
圆括号 () 是分组,有 3 种用途:
- 捕获组:把匹配内容记下来,后面可以
\1反向引用 - 非捕获组
(?:...):只分组不捕获,节省内存 - 命名捕获组
(?<name>...):用名字引用,代码更可读
举个真实例子:匹配 HTML 标签 <a href="...">,既要拿标签名又要拿属性。用 <\/?([a-z]+)([^>]*)> ——第一个括号捕获标签名,第二个捕获属性。命名捕获版本是 <\/?(?<tag>[a-z]+)(?<attrs>[^>]*)>,可读性好得多。
正则的分组比你想的复杂——Piick 正则测试工具 的「Explain」面板能把每个括号的作用拆给你看,不用猜。
5 个真实场景的正则样例
- 邮箱
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}——验证常见格式,严格 RFC 5322 那条太长,实战用简化版 - URL
https?:\/\/[^\s]+——匹配 http/https 开头到第一个空格 - IPv4
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b——4 段 0-255,完整校验要分段比较数字大小 - ISO 日期
\d{4}-\d{2}-\d{2}——形如 2026-06-28 - URL slug
[a-z0-9]+(?:-[a-z0-9]+)*——小写字母数字加中划线,博客文章 URL 通用格式
复杂正则别在脑子里写——粘到 Piick 正则测试工具 里,左边写右边实时高亮匹配,改一行看一次效果,比反复 reload 页面调试快 10 倍。
现在就打开 Piick 正则测试工具,粘一段文本进去,试一个从来没跑过的正则。