正则表达式语法速查表

5 个速查板块 · 关联 4 款站内工具 · 数据最后核对 2026-10-05

元字符、量词、分组、零宽断言逐项对照,并把「看起来一样、含义完全不同」的写法挑出来讲。这篇讲语法本身,不是现成模式合集。

正则的难点很少在于「不知道有这个语法」,而在于「写出来之后看不清它到底匹配了什么」。同样是几个符号,换个位置、加个问号,含义就完全不同。这篇按语法元件分类——字符类、量词、分组、断言——每一项都给出写法、含义和该注意什么。

需要先说明的是:这里讲的是正则语法本身,也就是「每个符号是什么意思」。如果你要的是现成的邮箱、手机号、身份证号这类模式,站内另有专门的正则模式速查工具,两者配合使用效果最好——先在这里看懂符号,再去那边取用成型的模式。

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 或常见字符类里,处理中文文本时要显式列出,否则「按标点切分」会失效

关于「正则表达式语法速查表」的常见问题

贪婪匹配和懒惰匹配有什么区别?

贪婪(默认)会尽可能多地匹配,懒惰(量词后加 ?)会尽可能少地匹配。举例来说,对 <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。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。