正则表达式语法速查表
元字符、量词、分组、零宽断言逐项对照,并把「看起来一样、含义完全不同」的写法挑出来讲。这篇讲语法本身,不是现成模式合集。
正则的难点很少在于「不知道有这个语法」,而在于「写出来之后看不清它到底匹配了什么」。同样是几个符号,换个位置、加个问号,含义就完全不同。这篇按语法元件分类——字符类、量词、分组、断言——每一项都给出写法、含义和该注意什么。
需要先说明的是:这里讲的是正则语法本身,也就是「每个符号是什么意思」。如果你要的是现成的邮箱、手机号、身份证号这类模式,站内另有专门的正则模式速查工具,两者配合使用效果最好——先在这里看懂符号,再去那边取用成型的模式。
1字符类:匹配「一个什么样的字符」
字符类决定单个位置能匹配哪些字符。大部分是简写形式,用起来快,但要知道它们的边界在哪里——尤其是 \w 和 . 这两个最容易被误解的。
| 写法 | 含义 | 注意 |
|---|---|---|
. | 任意字符(默认不含换行) | 要跨行匹配用 [\s\S] 或加 s 标志 |
\d / \D | 数字 / 非数字 | 等价于 [0-9] / [^0-9] |
\w / \W | 单词字符 / 非单词字符 | 等价于 [A-Za-z0-9_],不含中文 |
\s / \S | 空白 / 非空白 | 包含空格、制表符、换行符 |
[abc] | 括号内任一字符 | 方括号内大部分元字符失去特殊含义 |
[^abc] | 不在括号内的任一字符 | 注意 ^ 只有在方括号内首位才是「取反」 |
[a-z0-9] | 范围 | 按码点顺序,[a-Z] 会包含中间的符号,容易出错 |
[\u4e00-\u9fa5] | 常用汉字区间 | 匹配中文的正则写法 |
\b | 单词边界(零宽) | 不消耗字符,只做位置判断 |
2量词:决定「重复几次」
量词作用在它左边紧邻的那一个元素上。默认是「贪婪」——尽可能多匹配;在量词后面加 ? 就变成「懒惰」,尽可能少匹配。
| 写法 | 含义 | 说明 |
|---|---|---|
* | 0 次或多次 | 允许一个都没有 |
+ | 1 次或多次 | 至少要有一个 |
? | 0 次或 1 次 | 可选内容,也用于把贪婪改为懒惰 |
{n} | 恰好 n 次 | 如 \d{6} 匹配 6 位数字 |
{n,} | 至少 n 次 | 上不封顶 |
{n,m} | n 到 m 次 | 如 \d{4,6} 匹配 4 到 6 位 |
*? +? ?? | 懒惰版本 | 尽量少匹配,配合边界使用最有用 |
*+ ++ ?+ | 占有量词 | 不回溯,可避免灾难性回溯;并非所有语言都支持 |
作用范围是最常见的误解来源:`ab+` 是「a 后面跟一个以上 b」,不是「ab 重复多次」。要让整体重复,必须写成 `(ab)+`。
3分组、引用与选择
括号负责「把几个字符看成一个整体」,同时还能把匹配到的内容捕获下来供后面引用。如果只需要分组、不需要捕获,用非捕获分组可以少占编号、也略快一点。
| 写法 | 含义 | 说明 |
|---|---|---|
(...) | 捕获分组 | 可以用 \1 反向引用,替换时用 $1 取值 |
(?:...) | 非捕获分组 | 只分组不捕获,不占编号 |
(?<name>...) | 命名分组 | 按名字引用,可读性更好 |
\1 / \2 | 反向引用 | 引用前面第 1、2 个捕获组匹配到的内容 |
a|b | 选择(或) | 优先级最低,通常要配合括号圈定范围 |
(?:...) 加量词 | 整体重复 | 如 (?:ab)+ 表示 ab 重复一次以上 |
4零宽断言:匹配「位置」而不是「字符」
断言不消耗字符,只判断某个位置的前后是否符合条件,所以叫「零宽」。它们在需要「包含但不取出」的场景里不可替代,例如给数字加千分位、匹配密码里的多种字符要求。
| 写法 | 含义 | 典型用途 |
|---|---|---|
(?=...) | 先行断言:右侧必须匹配 | 密码必须含大写字母:(?=.*[A-Z]) |
(?!...) | 负向先行:右侧必须不匹配 | 排除某个词:(?!admin) |
(?<=...) | 后行断言:左侧必须匹配 | 取出金额数值但不含货币符号 |
(?<!...) | 负向后行:左侧必须不匹配 | 排除特定前缀 |
^ / $ | 开头 / 结尾 | 语义受多行标志 m 影响 |
\b | 单词边界 | 整词匹配,避免匹配到子串 |
兼容性提醒:后行断言 `(?<=)` 与 `(?<!)` 在旧版 JavaScript(ES2018 之前)和部分老引擎上不支持,需要兼容老浏览器时建议改用捕获分组再取值的写法。
5八组最容易写错的地方
下面每一条都来自「写的时候觉得没问题、跑起来才发现不对」的真实场景。看懂它们,正则的坑基本能避开大半。
- 贪婪 vs 懒惰
<.*>会一直匹配到最后一个>,<.*?>才是匹配到最近的那个。需要精确边界时,优先用「懒惰量词 + 明确的结束标记」,而不是靠贪婪去碰运气- `^` `$` 的语义随标志变化
- 不加多行标志时,它们匹配整个字符串的开头与结尾;加了 m 之后,才匹配每一行的开头与结尾。逐行处理文本时这两个行为差别很大
- `\w` 不包含中文
- 它是
[A-Za-z0-9_]的简写。要匹配中文必须显式写[\u4e00-\u9fa5],或使用 Unicode 属性转义(如\p{Script=Han},需引擎支持) - `.` 不匹配换行
- 这是默认行为。要跨行匹配用
[\s\S](最通用)或加上 s 标志 - 元字符必须转义
. + * ? ( ) [ ] { } ^ $ | \这些字符要匹配它们的字面量时,前面必须加反斜杠。例如匹配小数点要写\.- 灾难性回溯
(a+)+$这类嵌套量词在遇到长串且不匹配时会呈指数级变慢,可以卡死进程。能展开就展开,或用占有量词 / 原子分组限制回溯- 量词只作用于紧邻元素
ab+不等于(ab)+。这是初学阶段最高频的错误,尤其是从需求描述直接翻译成正则的时候- 中文标点与全角字符
- 中文逗号、句号、全角空格都不在
\s或常见字符类里,处理中文文本时要显式列出,否则「按标点切分」会失效
看完就能用的站内工具
全部工具总览 →正则表达式测试是一款免费的在线正则表达式调试和测试工具,支持实时高亮匹配、常用正则库、分组捕获等功能
在线正则表达式可视化调试工具,支持分组捕获树状展示、命名捕获组识别、逐步高亮匹配项、常用正则模板库,一键查看匹配位置与捕获内容。纯浏览器本地运行。
在线正则表达式中文解释工具,输入任意正则表达式,自动解析为逐字符、逐分组的语义说明,内置常用正则示例库,纯浏览器本地处理,适合学习与排查正则。
收录50+常用正则:手机/邮箱/身份证/URL/IP,支持一键复制、即搜即用、在线测试。
关于「正则表达式语法速查表」的常见问题
贪婪匹配和懒惰匹配有什么区别?
贪婪(默认)会尽可能多地匹配,懒惰(量词后加 ?)会尽可能少地匹配。举例来说,对 <b>粗体</b>和<i>斜体</i> 应用 <.*>,结果是整串(一直匹配到最后那个 >);用 <.*?> 则先匹配到 <b>粗体</b>。所以处理标签、引号、括号这类成对结构时,该用懒惰量词,否则很容易一次吃掉好几组。
为什么我的正则总是匹配到多余的内容?
九成是三个原因:一是用了贪婪量词却没有明确边界,改成懒惰版本试试;二是量词作用范围不对,比如想要「ab 重复」却写成了 ab+(这只重复 b),应该写 (ab)+;三是锚点缺失,导致匹配到了字符串中间的一段。排查时把正则放进可视化工具里看它实际匹配的范围,比盯着表达式猜要快得多。
\w 能匹配中文吗?
不能。\w 是 [A-Za-z0-9_] 的简写,只包含英文字母、数字和下划线。要匹配中文得显式写 [\u4e00-\u9fa5](覆盖常用汉字区间),或者使用支持 Unicode 属性转义的引擎写 \p{Script=Han}。这也是「英文环境测试通过、放到中文数据上就失效」的典型原因。
(?:) 和 () 有什么区别,什么时候该用哪个?
两者都能分组、都能加量词,区别在于是否「捕获」:() 会把匹配到的内容编号保存下来,可以后续用 \1 引用或在替换时用 $1 取出;(?:) 只分组、不保存。所以当你只是想让一个量词作用于多个字符(如 (?:ab)+),并不需要取用这段内容时,用 (?:) 更合适——少占编号,可读性也更好,性能上略优。
继续查:相关内容
全部速查 →内容说明:本页速查数据由本站自行整理,事实性内容以对应官方规范与文档为准,未复制第三方速查表或百科的表述。数据最后核对日期:2026-10-05。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。
速查在线工具箱