正则速查表

28 条常用元字符、量词与断言,每条都带含义和能直接复制的示例;页面下方还能输入正则和测试串,实时列出每一次匹配的索引与捕获组。

常用标志

等待执行。

元字符速查表(默认 12 行)
写法含义示例匹配结果
.任意一个字符,默认不含换行a.cabc 匹配;a 换行 c 不匹配(加 s 后匹配)
^串首;加 m 后匹配每行开头^aa\na 默认 1 处,加 m 后 2 处
$串尾;加 m 后匹配每行结尾b$同上,取决于 m 标志
*前一元素重复 0 次或多次ab*a、ab、abbb
+前一元素重复 1 次或多次ab+ab、abbb,单独的 a 不匹配
?前一元素重复 0 次或 1 次ab?a、ab
{n}前一元素恰好 n 次\d{4}2026
{n,}前一元素至少 n 次\d{2,}20、2026
{n,m}前一元素 n 到 m 次\d{3,4}010、1234
*?惰性量词,尽量少匹配<.+?>在 <a><b> 里只匹配 <a>
[abc]字符集合,匹配其中任意一个[aeiou]任一小写元音字母
[^abc]排除集合,匹配不在集合内的字符[^0-9]任何非 ASCII 数字的字符

使用方法

  1. 先在这张正则速查表里找到要用的写法,默认展示 12 行,点「加载更多」每次再加 12 行,共 28 行。
  2. 把拼好的表达式填进「正则表达式」,注意只填源码本身,不要带两侧的 /;例如示例里的区号加号码,就写作 (\d{3,4})-(\d{7,8}),两侧不要加斜杠。
  3. 在「常用标志」里勾选需要的开关,g 必须勾上——页面会强制补 g,否则 matchAll 直接抛错。也可以直接在「标志」框里手写字母组合。
  4. 在「测试字符串」里粘贴待匹配文本(示例是 010-12345678 021-87654321 400-1234),点「执行匹配」,或在输入框里按 Enter、在文本框里按 Ctrl+Enter(macOS 用 Cmd+Enter)。
  5. 结果区逐条给出序号、起始索引、整匹配和每个捕获组;示例正则会命中 2 条,第 1 条 index=0、组 1 是 010、组 2 是 12345678。

这个正则速查表能解决什么

写表达式时忘了某个元字符的准确写法,直接在这张表里查,每行都给了「示例 + 匹配结果」,比翻文档快。

拿不准一行正则到底会匹配出什么时,用下方的实时匹配区验证:能看到每次匹配的起始索引和捕获组内容,不用在控制台里反复试。

排查「为什么没匹配上」这类问题:多数情况是 \d 不认中文数字、. 不跨换行、贪婪量词吃多了,表里对应行都标了出来。

需要把一条长正则拆给同事看时,导出 CSV 或复制对照表,把用到的行连同示例一起贴过去。

本页只做语法速查与本地匹配演示,不做表达式的批量替换——替换请交给正则替换工具;要把一段文本里的特殊字符转成正则字面量,请用正则转义工具;要在真实数据上反复调试完整表达式,用正则表达式测试工具更合适。

原理与规则说明

匹配走的是 new RegExp(source, flags) 构造加 String.prototype.matchAll(regexp)。matchAll 返回一个迭代器,需要 Array.from 展开后才能拿到数组;每个元素上 m[0] 是整匹配、m[1] 起是捕获组、m.index 是起始下标、m.groups 是命名组。

为什么必须用 matchAll 而不用 String.prototype.match:带 g 的 match 只返回整匹配字符串数组,捕获组全被丢掉。实测同一条 (\d{3,4})-(\d{7,8}),match 给出的是 ["010-12345678","021-87654321"] 两个裸串,matchAll 才给出区号和号码两个组。反过来,matchAll 又要求正则一定带 g,不带就抛 TypeError: String.prototype.matchAll called with a non-global RegExp argument,所以本页在构造前会自动往标志里补一个 g。

正则速查表里列出的 28 条写法都按 ECMAScript 的正则方言校验,不保证在 PCRE、Python re 或 Java 里同样成立。遵循的标准是 ECMA-262(ECMAScript 语言规范)里 RegExp 对象那一章。页面用到的几个标志都有明确出处:u 打开 Unicode 模式,让 . 和量词按码点而不是 UTF-16 码元工作;s(dotAll)让 . 匹配换行;m 让 ^ $ 匹配每行首尾;d 给每次匹配补上 indices 数组,能取到每个组的起止下标。

输入到输出的转换链是:源码字符串 + 标志字符串 → new RegExp → 迭代器逐条产出 → 每条取 index、m[0]、第 1 到第 n 个组、m.groups 的键 → 拼成带序号的文本行。正则里如果写了命名组,结果里会额外打印 groups.名字。

边界有三个具体数字:测试串上限 2 000 字符,超过提示截断;匹配结果最多列出 1 000 条,超过只显示前 1 000 条并提示;表达式源码本身不限长度但由浏览器 RegExp 引擎校验,非法会抛 SyntaxError 并把原始信息原样显示。

完整示例(数值仅作演示)

默认参数:正则 (\d{3,4})-(\d{7,8}),标志 g,测试串 010-12345678 021-87654321 400-1234。实测输出 2 条:

改成 (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) 去匹配 2026-10-03,结果里会多出一行 groups: y=2026 m=10 d=03。

输入范围与对照表

项目允许范围默认值超出后的处理
正则表达式源码任意合法 ECMAScript 正则,不含两侧斜杠(\d{3,4})-(\d{7,8})抛 SyntaxError 时原样显示错误信息
标志g / i / m / s / u / d 的任意组合,最多 6 个字符g非法字母由 RegExp 构造报错
测试字符串1 ~ 2 000 字符示例 34 字符超过提示「当前 X 字符,上限 2000」
匹配条数最多列出 1 000 条示例 2 条截断并提示总条数
速查表行数28 行,默认渲染 12 行12 行点「加载更多」补 12 行

速查表默认 12 行,点一次「加载更多」变 24 行,再点显示全部 28 行;「导出 CSV」带 BOM 头,Excel 打开中文不乱码。

输入范围、边界与精度说明

零宽匹配是最容易让人以为「工具坏了」的地方。正则 /(?:)/g 不消耗任何字符,在 abc 上会产出 4 条匹配(下标 0、1、2、3);/x*/g 在 abcdefghij 上会产出 11 条。这不是 bug,是规范允许的行为,所以本页把条数卡在 1 000 条以内。

灾难性回溯有实测阈值:嵌套量词 /(a+)+b/ 对 20、22、24、26 个 a 加一个 c 做测试,耗时分别是 13.6、54.5、225、907 毫秒,每多 2 个字符大约翻 4 倍。所以测试串卡在 2 000 字符,并且嵌套量词要慎用。

\d 的字符集只有 ASCII 的 0-9。实测 /\d/.test('一二三') 是 false,/\d/.test('123') 也是 false,连数学粗体数字 U+1D7D9 都不算。要匹配中文数字得写 [一二三四五六七八九十] 或先做全角半角转换。

. 与锚点的边界:/a.b/ 对 a\nb 是 false,加 s 变 true;/^a$/ 对 a\na 是 false,加 m 变 true。\w 同样只覆盖 [A-Za-z0-9_],/\w/.test('中') 是 false,中文不属于单词字符。

精度上,m.index 是匹配起始处的下标,按 UTF-16 码元计数;如果文本里有 emoji 这类增补平面字符,下标会比「第几个字符」大一倍,需要勾选 u 并自行按码点换算。

常见误用:把贪婪量词当成「匹配到下一个」。实测 /<.+>/ 在 <a><b> 上会一路吃到 <a><b> 整体,惰性写法 /<.+?>/ 才停在 <a>。

常见问题

为什么页面的结果比我在控制台里用 match 拿到的多?

因为本页用 matchAll 自动补了 g 标志并逐条展开迭代器,而控制台里不带 g 的 match 只返回第一条及其捕获组。两者口径不同,不是结果不一致。

为什么一条都没匹配上?

先按上面三条自查:\d 不认中文数字和全角数字;. 默认不跨换行;锚点 ^ $ 默认只认整个串的首尾。把标志加上 s 或 m 再试一次。

结果里出现大量空匹配是怎么回事?

说明你的量词允许匹配 0 个字符,例如 \d* 或 (?:)。这类零宽匹配在每个位置都会成立,属于规范允许的行为,改成 + 或补上必选部分即可。

勾选 d 标志有什么用?

它给每次匹配补上 indices 数组,包含整匹配和每个捕获组的起止下标,做高亮或切片时比自己算 index + m[0].length 可靠。

嵌套量词导致页面卡住怎么办?

把测试串缩短或改写表达式。实测 (a+)+b 在 26 个字符上就要 907 毫秒,再长会指数增长;改成 a+b 这类无嵌套写法就没有回溯爆炸。

能不能一次试多个正则?

不能,本页一次只执行一条表达式。需要对比多条候选写法时,用测试串不变、逐条替换源码的方式验证,或者改用专门的正则测试页。

命名组和数字组会重复显示吗?

会。结果里先打印第 1 到第 n 个数字组,再单独打印一行 groups,方便你确认命名是否生效,这是刻意设计的,不是重复 bug。

测试内容会被发到服务器吗?

不会。整页只用浏览器自带的 RegExp 引擎,没有任何网络请求;可以在开发者工具的 Network 面板确认,除页面自身 CSS 外不会再发出请求。

相关工具

正则速查表只覆盖语法查询和本地匹配演示,下面这些页面各接一段后续工作。