使用方法
- 先在这张正则速查表里找到要用的写法,默认展示 12 行,点「加载更多」每次再加 12 行,共 28 行。
- 把拼好的表达式填进「正则表达式」,注意只填源码本身,不要带两侧的
/;例如示例里的区号加号码,就写作(\d{3,4})-(\d{7,8}),两侧不要加斜杠。 - 在「常用标志」里勾选需要的开关,
g必须勾上——页面会强制补g,否则matchAll直接抛错。也可以直接在「标志」框里手写字母组合。 - 在「测试字符串」里粘贴待匹配文本(示例是
010-12345678 021-87654321 400-1234),点「执行匹配」,或在输入框里按 Enter、在文本框里按 Ctrl+Enter(macOS 用 Cmd+Enter)。 - 结果区逐条给出序号、起始索引、整匹配和每个捕获组;示例正则会命中 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 条:
- 第 1 条:index=0,整匹配
010-12345678,组 1 =010,组 2 =12345678。 - 第 2 条:index=13,整匹配
021-87654321,组 1 =021,组 2 =87654321。 - 末尾的
400-1234不匹配,因为\d{7,8}要求 7 到 8 位号码,而1234只有 4 位。
改成 (?<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 外不会再发出请求。
相关工具
正则速查表只覆盖语法查询和本地匹配演示,下面这些页面各接一段后续工作。
- 正则表达式测试工具——在完整表达式上做带替换、带分组的批量调试。
- 正则转义工具——把一段普通文本里的元字符转成正则字面量。
- 正则替换工具——按正则批量替换并预览替换结果。
- Git速查表——同属速查类,收录常用 Git 命令。
- HTTP状态码代码速查表——查状态码含义,写接口时对着看。
- CSS单位速查表——查 px、rem、vh 等单位的定义与换算。
- HTML转纯文本转换器——先用它去标签,再跑正则能少写很多容错。