免费正则表达式测试器 — 在线实时匹配与调试
在浏览器里实时测试正则表达式:高亮匹配、捕获组、命名分组、替换预览、字符串切分与逐 token 解释,支持 JavaScript(ECMA-262)方言、g/i/m/s/u/y/d 七个 flag、ReDoS 超时保护。100% 本地运行、免费、无需注册。
什么是正则表达式测试器?
正则表达式测试器(regex tester)是一类工具:写一段 pattern、贴一段测试文本,立刻看到 pattern 实际匹配到了什么——附带捕获组、替换预览和 flag 解释——完全不需要重新编译代码或运行脚本。对开发者而言,它把调试循环从分钟级压到毫秒级:改改 pattern、看着高亮移动、放心发车。
正则表达式是一种用来描述文本模式的紧凑语言。`\d+` 匹配一个或多个数字。`[A-Za-z_]\w*` 匹配一个典型的标识符。`(?
本测试器跑的是每个现代浏览器内置的原生 ECMA-262 RegExp 引擎——和你在 JavaScript、TypeScript、Node.js、Deno、Bun 里调用的是同一套。也就是说,支持:捕获组(数字编号与 `(? 除了原始匹配之外,测试器还把哪些信息呈现出来:「匹配与捕获组」面板列出每条匹配的 [start, end) 偏移与各捕获组的值——与你从 `String.prototype.matchAll` 配合 /d flag 拿到的信息一致,只是为视觉扫读做了排版。Replace 标签提供实时替换预览,支持完整的 $1 / $& / $` / $' / $$ / $ 隐私层面:每一个操作都在本地。你的 pattern 和测试文本绝不会离开页面——不记日志、不发分析、不存盘。只有 UI 偏好(当前标签 + 常开 flag)会落到 localStorage。这让本工具可以放心用于脱敏日志样本、专有 pattern、内部配置,以及那些会暴露数据 schema 线索的 pattern。相比 regex101 这种走服务端的测试器,隐私与延迟都更胜一筹;代价是只支持单一方言(仅 JavaScript)。 如果你刚开始学正则,「常用 pattern」下拉里准备了若干历经考验的起手式:邮箱地址、URL、IPv4、UUID、十六进制颜色、ISO 日期、美国电话号码,以及一个修剪末尾空白的 pattern。载入一个,盯着它在样本文本上的匹配,然后一个字符一个字符地改写,体会引擎的反应。配合 文本对比 工具可以对照 regex 清洗前后的差异;配合 JSON 格式化 处理 JSON 输入或预期输出;配合 URL 编码解码 处理 URL 编码过的字符串。
// The pattern you build in this tester drops straight into JavaScript.
// Example: extract every ISO date from a string with named groups.
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g;
const text = 'shipped 2026-05-21, scheduled 2026-06-30';
for (const m of text.matchAll(pattern)) {
console.log(m.groups.year, m.groups.month, m.groups.day);
// → 2026 05 21
// → 2026 06 30
}
// Same regex, used in a replace with $<name> templates:
text.replace(pattern, '$<day>/$<month>/$<year>');
// → 'shipped 21/05/2026, scheduled 30/06/2026'
// With the /d flag, every match carries [start, end] indices
// per capture group — the Matches panel uses this to paint offsets.
const p2 = /(?<year>\d{4})-(?<month>\d{2})/gd;
const m = [...text.matchAll(p2)][0];
m.indices.groups.year; // [8, 12] 核心特性
实时匹配高亮
pattern 一旦解析成功,测试文本里每条匹配都会即时亮起。交替色让相邻匹配一目了然,结果上方的计数 badge 给你确切总数——没有「运行」按钮、没有超过 200ms 的 debounce 延迟。
捕获组侧栏
右侧「匹配与捕获组」面板把每条匹配渲染成一张卡片,包含 [start, end) 偏移、完整匹配文本,以及内部所有位置分组与命名分组。命名分组以 $
实时 Replace 预览($1 / $& / $)
切到 Replace 标签,替换效果实时呈现。完整的 ECMAScript 替换字母表全部生效:$1..$N 取位置分组、$
按 regex 切分(Split)
Split 标签用你的 regex 调用 String.prototype.split,把每一段编号显示。空字符串段以 ⏎ 字形渲染,让你看清引擎是怎么处理相邻分隔符的——调试 CSV 类输入清洗时尤其顺手。
Pattern 解释器(逐 token)
Explain 标签把 pattern 拆成按类别着色的 chip(转义 / 量词 / 字符类 / 分组 / 锚点 / alternation),每个 chip 配一行说明。把自己写的 regex 朗读一遍再发车,也适合用于代码评审或教学。
ReDoS 安全(wall-clock 超时)
每次 match 调用都套着 250 毫秒预算。`(a+)+`、`(a|aa)+b`、深度嵌套量词等经典灾难性回溯形状会干净地中止并显示「Pattern timed out」警告——页面保持响应,标签页不会被锁死。无需服务端沙箱就能完成检测。
常用 pattern 库
为开发者最常用的八种 pattern 准备了实战起手式:email、URL、IPv4、UUID v4、十六进制颜色、ISO 日期、美国电话号码、去末尾空白。每条都附带匹配样本,让你在改写之前先看到 regex 在跑。
Permalink 分享(不上传)
「Copy link」把 pattern + flag + 样本文本编码进 URL 哈希(#p=…&f=gim&t=…)。浏览器不会在请求里传 URL fragment,所以分享出去的链接会在对方机器上重建状态,完全不碰 go-tools.org 服务器。自包含、便于审计。
100% 隐私,仅在浏览器运行
你的 regex 和测试文本永远不会离开本机。零网络请求、零日志、零按键分析。打开 DevTools → Network 自行核验:打字时网络请求为 0。专有 pattern、脱敏日志、任何你不愿贴进 regex101 的文本,放心用。
实战示例
从一段文字中提取所有邮箱地址
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g 把表达式贴入模式框、打开 /g flag、把段落贴进测试文本,每个邮箱都会在高亮视图里亮起。右侧的「匹配与捕获组」面板会列出每个邮箱以及它的 [start, end) 偏移量——在你把同一个 regex 喂给 grep、sed 或代码编辑器时非常实用。
用命名分组捕获日期的各个部分
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g ECMA-262 命名分组会以 $
用 $1 反向引用做查找替换
(\w+) (\w+)
替换模板:$2, $1 → Jack Doe → Doe, Jack
两个无名捕获组,替换模板 $2, $1,Replace 标签给你一个实时预览。$&、$`、$'、$$、$
逐行去掉末尾空白
[ \t]+$
/[ \t]+$/gm
把 /g(global)和 /m(multiline)两个 flag 一起打开,$ 就会在每一行末尾生效,而不仅仅是整段文本结尾。Replace 标签用空字符串做替换预览,你会看到一份干净的 diff:行末的制表符和空格全部消失,正文保持原样。同样的 regex 若关闭 /s(dotAll),点号就不会跨行。
识别灾难性回溯并安全脱身
(a+)+b
测试文本:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
嵌套的 + 量词是经典的 ReDoS 形状。在没有保护的测试器里,这种 pattern 直接把页面卡死。而这里 250 毫秒的 wall-clock 看门狗会触发,「Pattern timed out」横幅弹出,页面依然响应。给 pattern 加锚点、改成不重叠的 alternation,或者用类似 atomic 的写法——再重新测试一次。
用混合分隔符切分类 CSV 文本
[,;|]\s*
alpha, beta; gamma | delta → ["alpha", "beta", "gamma", "delta"]
切到 Split 标签。任何逗号、分号或竖线(后面可选空白)都会成为切分边界。适合清洗复制粘贴来的标签列表、规范化用户输入,或者在用真正的 CSV 解析器之前预处理日志字段——当数据真的是 RFC 4180 时,请看 CSV 转 JSON。
如何使用正则测试器
- 1
把 pattern 写进两条斜线之间
在 /…/ 输入框里放任意 ECMA-262 正则表达式。非法 pattern 会标红并提示 parser 报错;合法 pattern 立刻进入实时匹配。
- 2
切换你需要的 flag
g(global)、i(忽略大小写)、m(multiline)、s(dotAll)、u(unicode)、y(sticky)、d(indices)。每个 chip 打开时会亮起;pattern 右侧的 readout 会显示规范化的字面量。
- 3
把测试文本贴进来
随键入实时高亮,相邻匹配以交替色区分。右侧的「匹配与捕获组」面板会列出每条匹配的 [start, end) 偏移、完整匹配文本与每个捕获组的值(命名分组以 $
标注)。 - 4
切换标签做替换、切分或解释
Replace 在输入旁预览替换模板。Split 按匹配边界切分文本。Explain 把 pattern 一个 token 一个 token 拆开,给每个元素配一条纯文字描述。
- 5
复制字面量或分享 permalink
「Copy /pattern/flags」把规范化的 regex 字面量复制到剪贴板,可直接贴进 JavaScript / TypeScript / Node。「Copy link」把完整状态编码进 URL 哈希(不会上传),同事在本地就能复现。
常见正则错误
忘了开 /g flag,只拿到一条匹配
不开 /g(或 /y),引擎在第一条匹配后就停。match、matchAll、replace、split 在 global flag 上的行为各不相同。打开 /g 再跑一次,结果上方的计数就会从 1 跳到 N。
Pattern: /\d+/ → '1 22 333' 只拿到 ['1']
Pattern: /\d+/g → '1 22 333' 拿到 ['1', '22', '333']
贪婪量词吃太多
`.+` 会尽可能多地吞字符,所以 `<.+>` 跑在 ` and ` 上会命中 ` and `,而不是 ``。换成懒量词(`.+?`)、收紧字符类(`[^>]+`),或用 lookaround 加锚定。
Pattern: /<.+>/ → 命中 '<a> and <b>'
Pattern: /<[^>]+>/ → 分别命中 '<a>' 和 '<b>'
嵌套量词引发灾难性回溯
`(a+)+b` 对着长失败串会指数级爆炸。250ms 之后会弹出「Pattern timed out」横幅;重写时把嵌套去掉:`a+b` 在线性时间内做同一件事。也可以用 atomic group 模拟 `(?=(a+))\1b`。
Pattern: /(a+)+b/ 跑 'aaaaaaaaaaaaaaaaaaaaac' → 超时
Pattern: /a+b/ 同样输入 → 瞬间得到「无匹配」
锚点 $ 和 ^ 不等于 Python 的 \A 与 \Z
在 JavaScript 里,`^` 与 `$` 只有开了 /m 才表示行首/行尾;否则表示整串首尾。Python 那种永远表示串边界的 `\A` 与 `\Z` 在 JS 里不存在。按需切换 /m。
Pattern: /^Error/ 在多行日志上不开 /m → 只命中第一行
Pattern: /^Error/m 同样输入 → 匹中所有以 Error 开头的行
字符串模板想用 $1,但传了函数给 replace
`text.replace(re, '$1')` 会展开反向引用。`text.replace(re, () => '$1')` 直接返回字面量 '$1',因为函数收不到模板 token。在回调里,捕获组以位置参数形式传入。
text.replace(/(\w+)/, m => '$1') → 得到字面量 '$1'
text.replace(/(\w+)/, (_, g1) => g1.toUpperCase()) → 真正用到捕获
Unicode 字符匹不上 \w 或 .
默认的 `\w` 就是 `[A-Za-z0-9_]`。要在所有文字系统里匹字母,请打开 /u 并换成 `\p{Letter}`(`\p{L}`)。点号默认也在换行处停——想要真正的「任意字符」就开 /s(dotAll)。
Pattern: /\w+/ 能匹 'hello',匹不上 'héllo' 或 '你好'
Pattern: /\p{Letter}+/u 三个都能匹 贴了一段 PCRE pattern,结果报 SyntaxError
JavaScript 不支持 atomic group `(?>...)`、占有量词 `a++`、行内修饰符 `(?i)`、条件分支 `(?(1)yes|no)`,也没有 `\A` / `\Z`。parser 报错会指名是哪个构造——把它改写成 JS 支持的等价写法(lookaround 模拟、单独切 flag、用 alternation)即可。
Pattern: (?i)foo → SyntaxError: invalid group
Pattern: foo 配 /i flag 打开 → 效果一致
谁在用这个工具
- 在上线前验证表单输入
- 确认你的 email / 电话 / 邮编 / 用户名 regex 真的匹中了你预期的东西——并且拒掉了你不期望的——覆盖各种边界情况(Unicode 姓名、+ 号别名、国际化格式),不要让校验在生产上反复弹真实用户。
- 从日志和配置里抽取数据
- 搭一段 pattern,从任意日志切片里拉出 request ID、状态码、延迟或栈帧行。命名分组让数据自带说明;匹配面板显示偏移,让你之后可以把同一个 regex 喂给 `rg --replace` 或 `grep -oE`。
- 在代码库里做查找替换
- 先在这里起草一段重构 pattern(比如 `(\w+)\.apply\(null,\s*\[(.*?)\]\)` → `$1($2)`),对着典型片段预览替换结果,再把验证过的 regex 贴进编辑器的项目级查找替换,放心发车。
- 对网上抄来的 pattern 做合理性检查
- 从 StackOverflow 或博客复制了一段 regex?丢进 Explain 标签——每个 token 都会被翻译成纯英文/中文。提前发现细微问题(本该 `.+` 却写了 `.+?`、漏掉 `^`/`$` 锚点、不小心写成贪婪量词),别让它进你的代码。
- 给队友讲清楚正则
- 对着一段能跑的 pattern 打开 Explain 标签,一个 token 一个 token 走过去。颜色编码(转义 / 量词 / 字符类 / 分组 / 锚点 / alternation)让新手一眼看到 regex 的结构形态,而不是只看到字符的堆砌。
- 在不同语言之间移植 pattern
- 手里有一段 Python 或 PCRE 的 regex 要在 JavaScript 里用?贴进来。能解析,解释器就告诉你它在 JS 下的语义;解析不了,parser 报错会指名是哪个构造(atomic group、占有量词、行内 `(?i)`)出问题,让你确切知道该改哪里。
- 调试线上慢 regex
- 怀疑服务端某段 regex 触发了灾难性回溯?把它和一份真实输入样本贴进这个测试器。在病态情况下 250ms wall-clock 看门狗会触发,你不用上 profiler 就能拿到诊断结论——解释器还会把嵌套量词的病灶指出来。
引擎与算法说明
- ECMA-262 RegExp 引擎(浏览器原生)
- 底层就是 `new RegExp(pattern, flags)`,跑的是 V8 / JavaScriptCore / SpiderMonkey 内置引擎——和你在任意 JavaScript 环境里得到的 regex 语义完全一致。在这里通过验证的 pattern 在 Node.js、Deno、Bun 以及每个现代浏览器里都能原样运行。
- 用 String.matchAll 做匹配迭代
- 全局迭代用的是 `text.matchAll(regex)` 而不是手写 lastIndex 循环,因此每条匹配都自带捕获组、命名分组,以及(开 /d 时)[start, end] 索引。零宽匹配按标准做 +1 lastIndex 推进,避免死循环。
- Wall-clock 超时做 ReDoS 防护
- 每次 match、replace、split 都套着 250 毫秒预算。引擎在一次匹配尝试内部仍会回溯,但外层迭代会配合预算——病态 pattern 以 `timedOut: true` 中止,UI 弹出警告而不是锁死标签页。
- 替换模板的重新实现
- Replace 标签的 $1..$N、$&、$`、$'、$$、$
是手写解析的,而不是直接交给 `String.replace`——好处是即使在命名分组模板有边界情况的旧引擎(旧 Safari、旧 Node)上,预览结果也保持一致。输出就是当前 JavaScript 引擎该有的样子。 - 为解释器准备的 pattern tokenizer
- Explain 标签跑的是手写 tokenizer,把每一段 pattern 归到(转义 / 元字符 / 量词 / 字符类 / 分组起 / 分组止 / 锚点 / alternation)某一类里。无法识别的构造会落到 `literal` 上配一行通用说明,确保解释器永远不会悄悄丢内容。
- Permalink 走 URL 哈希(永远不传输)
- 分享状态编码在 location.hash 片段里(`#p=…&f=…&t=…&tab=…`)。浏览器不会在 HTTP 请求中传 fragment,所以 go-tools.org 服务器在 permalink 被打开时收到 0 字节数据。hydration 完全发生在对方设备上。
正则最佳实践
- 需要锚定时一定要锚定
- `^pattern$` 匹配整串严格相等;`pattern` 在任意位置都能命中。选错是表单校验最常见的 bug:漏掉 `^` 会让 `attacker.com/` 之类的前缀混进域名检查;漏掉 `$` 会让末尾乱码通过。用 Match 标签对着故意构造的非法样本跑一遍,确认到底拒掉了什么。
- 纯结构用非捕获分组
- `(?:foo|bar)+` 和 `(foo|bar)+` 功能完全相同,但前者不分配捕获组。每当分组只是为了配合量词或 alternation,就用 `(?:…)`——能让你的 $1..$N 编号保持稳定,也省掉引擎一点点开销。
- ASCII 之外的内容请开 /u
- 不开 /u 时,点号和 `\w` 会把代理对字符(emoji、非 BMP 码点)当成两个 UTF-16 码元;开 /u 后,它们各自是一个码点——和你的用户在视觉上看到的一致。/u 还启用 `\p{Letter}` 等属性转义。写新 pattern 时默认开 /u,除非你有具体理由不开。
- 给捕获组起名字
- `(?
\d{4})-(? \d{2})` 是自带说明的。半年后回头看这段 regex,`m.groups.year` 一眼能知道是年——`m[1]` 不行。带 $ 的替换模板也对分组顺序调整免疫:一旦有人在中间加一个新分组,位置模板会立刻爆掉。 - 测失败用例,而不只是成功用例
- regex tester 真正的用处是验证失败。先确认 pattern 匹中了什么,再故意改测试文本看它没匹中什么——前导空白、末尾空白、缺字段、多字段、大小写错、多语种混杂。只能 happy path 通过却放过垃圾输入的 pattern,是生产上最先被 user 暴出来的那种 bug。
常见问题
我输入的正则或测试文本会被发到服务器吗?
这个测试器用的是哪个 regex 方言——PCRE、Python、Java 还是 JavaScript?
g、i、m、s、u、y、d 这几个 flag 分别是什么作用?
怎么写捕获组?怎么回引它们?
先行(lookahead)与后行(lookbehind)怎么用、用来做什么?
为什么我的 regex 把浏览器卡住了?什么是灾难性回溯?
这个 regex tester 和 regex101.com 有什么不同?
怎么转义 . | ( ) [ ] { } * + ? ^ $ \ 这些特殊字符?
我能用一个链接把 regex 分享给同事吗?
测试器支持 Unicode、emoji 和非拉丁文字吗?
.match、.matchAll、.replace、.split 配 regex 用时有什么区别?
为什么我的 Python 或 Java regex 在这里跑不起来?
测试文本或匹配数量有上限吗?
相关工具
查看所有工具 →在线文本对比与差异工具
文本处理
在浏览器内即时对比两段文本。双栏并排展示、行内单词级高亮、统一 diff 补丁导出,支持忽略大小写、空白与空行。100% 本地浏览器处理,无需上传,文本不离开你的设备。
免费字数统计与字符计数工具
文本处理
在浏览器里实时统计单词数、字符数、句子、段落与阅读时间,并对照 Twitter、meta description、Instagram 等平台字符限制给出实时进度条。免费、隐私、无需注册。
进制转换器 — 二进制、十六进制、十进制、八进制互转
转换工具
在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。
Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
Crontab 生成器与 Cron 表达式构建工具
日期和时间
在浏览器里构建、校验并解读 cron 表达式,按本地时间或 UTC 实时预览下一次运行。支持 POSIX 五字段语法、常用预设和中文描述。免费、隐私、无需注册。
CSV 转 JSON 转换器
编码和格式化
在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。