Skip to content

免费正则表达式测试器 — 在线实时匹配与调试

在浏览器里实时测试正则表达式:高亮匹配、捕获组、命名分组、替换预览、字符串切分与逐 token 解释,支持 JavaScript(ECMA-262)方言、g/i/m/s/u/y/d 七个 flag、ReDoS 超时保护。100% 本地运行、免费、无需注册。

无追踪 浏览器中运行 免费
所有测试都在你的浏览器里本地完成。pattern 与测试文本绝不会离开本设备。
Flag
高亮匹配
匹配与捕获组
已对 ECMA-262 一致性、捕获组正确性(开关 /d 两种情况)、与 String.prototype.replace 等价的替换模板、wall-clock 预算下的 ReDoS 抗性,以及可访问性(ARIA 角色、屏幕阅读器匹配播报、RTL/LTR 处理)逐项审阅。 — Go Tools 文本工具团队 · 2026年5月21日

什么是正则表达式测试器?

正则表达式测试器(regex tester)是一类工具:写一段 pattern、贴一段测试文本,立刻看到 pattern 实际匹配到了什么——附带捕获组、替换预览和 flag 解释——完全不需要重新编译代码或运行脚本。对开发者而言,它把调试循环从分钟级压到毫秒级:改改 pattern、看着高亮移动、放心发车。

正则表达式是一种用来描述文本模式的紧凑语言。`\d+` 匹配一个或多个数字。`[A-Za-z_]\w*` 匹配一个典型的标识符。`(?\d{4})-(?\d{2})-(?\d{2})` 匹配 ISO 日期并给每一部分起好名字。正则表达式是每个代码编辑器里查找替换的脊梁、每个表单里校验的底座、每个可观测性栈里日志解析的内核,也是 `grep`、`sed`、`awk` 这些半个互联网都在用的 Unix 工具的基础。它们同时也以「写对很难」著称:偏一位的量词、漏掉的转义,会让 pattern 匹中错误子串、漏掉真实匹配,或者——最糟的情况——触发灾难性回溯把一颗 CPU 整核劫持。一个好的 regex tester 能在这些失败模式进生产之前把它们逮住。

本测试器跑的是每个现代浏览器内置的原生 ECMA-262 RegExp 引擎——和你在 JavaScript、TypeScript、Node.js、Deno、Bun 里调用的是同一套。也就是说,支持:捕获组(数字编号与 `(?...)` 命名分组)、先行与后行断言(`(?=...)`、`(?!...)`、`(?<=...)`、`(?

除了原始匹配之外,测试器还把哪些信息呈现出来:「匹配与捕获组」面板列出每条匹配的 [start, end) 偏移与各捕获组的值——与你从 `String.prototype.matchAll` 配合 /d flag 拿到的信息一致,只是为视觉扫读做了排版。Replace 标签提供实时替换预览,支持完整的 $1 / $& / $` / $' / $$ / $ 模板字母表——恰好就是 JavaScript 的 String.replace 接受的那一套。Split 标签用你的 regex 调用 String.split,并显示每一段。Explain 标签把 pattern 拆成 token,每一片都配一段纯文字注释,适合代码评审、教学,也适合在方言之间做移植。

隐私层面:每一个操作都在本地。你的 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 命名分组会以 $、$、$ 的形式出现在右侧面板。切到 Replace 标签,试一下 $/$/$,一遍就能把 ISO 日期改写成 DMY 顺序——在任意现代 JS 引擎的 replace 调用里也是一样的写法。

用 $1 反向引用做查找替换

(\w+) (\w+)
替换模板:$2, $1   →   Jack Doe → Doe, Jack

两个无名捕获组,替换模板 $2, $1,Replace 标签给你一个实时预览。$&、$`、$'、$$、$ 全部支持——就是 ECMAScript 规范里的那套替换字母表,所以复制出去的结果直接丢进任何 JS 引擎都能跑。

逐行去掉末尾空白

[ \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. 1

    把 pattern 写进两条斜线之间

    在 /…/ 输入框里放任意 ECMA-262 正则表达式。非法 pattern 会标红并提示 parser 报错;合法 pattern 立刻进入实时匹配。

  2. 2

    切换你需要的 flag

    g(global)、i(忽略大小写)、m(multiline)、s(dotAll)、u(unicode)、y(sticky)、d(indices)。每个 chip 打开时会亮起;pattern 右侧的 readout 会显示规范化的字面量。

  3. 3

    把测试文本贴进来

    随键入实时高亮,相邻匹配以交替色区分。右侧的「匹配与捕获组」面板会列出每条匹配的 [start, end) 偏移、完整匹配文本与每个捕获组的值(命名分组以 $ 标注)。

  4. 4

    切换标签做替换、切分或解释

    Replace 在输入旁预览替换模板。Split 按匹配边界切分文本。Explain 把 pattern 一个 token 一个 token 拆开,给每个元素配一条纯文字描述。

  5. 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']

谁在用这个工具

在上线前验证表单输入
确认你的 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。

常见问题

我输入的正则或测试文本会被发到服务器吗?
不会。匹配(match)、替换(replace)、切分(split)、解释(explain)的每一次运算都在你浏览器里用原生 RegExp 引擎完成。你的 pattern 和文本不会上传、不会写日志、不会落盘、不会发给任何第三方。只有 UI 偏好(当前激活的标签 + 你通常打开的 flag 组合)会保存在 localStorage 里,下次访问能记住——pattern 和测试文本绝不会被持久化。你可以打开 DevTools → Network 自行验证:在任一输入框里打字,网络请求数为 0。所以这个工具放心用于专有 pattern、脱敏日志样本、内部配置,以及任何你不愿意贴进 regex101 的内容。
这个测试器用的是哪个 regex 方言——PCRE、Python、Java 还是 JavaScript?
ECMA-262(JavaScript),也就是 V8、JavaScriptCore、SpiderMonkey 实现的那种方言——和你在任意浏览器、Node.js、Deno、Bun 里 `new RegExp(pattern, flags)` 拿到的引擎完全一致。所以支持的特性包括:捕获组(数字编号 + `(?...)` 命名分组)、零宽断言中的先行 `(?=...)` 与 `(?!...)`、后行 `(?<=...)` 与 `(?...)`、占有量词 `a++`、条件分支 `(?(1)yes|no)`、行内修饰符 `(?i)`,会抛出语法错。Python 的 `re.VERBOSE` 这里也不支持。需要 Python/Java/Go 的 regex 时,把 pattern 移回原生引擎——大多数简单 pattern 不需要任何修改即可迁移,本工具的解释器也是方言中立的。
g、i、m、s、u、y、d 这几个 flag 分别是什么作用?
g(global)——匹配所有,不只是第一个;用 .matchAll 迭代或全局替换时必须开。i(case-insensitive)——A 与 a 视为同一字符。m(multiline)——^ 与 $ 在每个换行处都生效,而不仅仅是整段输入的首尾。s(dotAll)——. 也匹配换行;不开 /s 时点号遇到 \n 就停。u(unicode)——启用 \u{HHHH} 转义、Unicode 属性转义(\p{Letter}),并把 pattern 按 Unicode 码点而不是 UTF-16 码元处理。y(sticky)——每次匹配都锚定在 lastIndex,适合写 tokenizer。d(hasIndices,ES2022)——在每个捕获组上填充 `.indices` 与 `.indices.groups` 的 [start, end] 对;本测试器内部默认开 /d 以便画出分组边界。在测试文本上方的 chip 上点一下即可切换;右侧 readout 会显示规范化后的 /pattern/flags 字面量。
怎么写捕获组?怎么回引它们?
把子表达式用括号包起来即可:`(\d{4})-(\d{2})-(\d{2})` 给你三个位置分组,替换里写 $1、$2、$3,匹配面板里也能看到 m.groups[0..2]。命名分组用 `(?...)`:`(?\d{4})-(?\d{2})` 让你在替换模板里写 $/$。`(?:...)` 是非捕获分组,仅用于配合量词或 alternation(比如 `(?:foo|bar)+`),它不会产生反向引用,能让你的 $1..$N 编号保持稳定。要在同一个 pattern 内回引先前的捕获,用 `\1`、`\2` 等——找重复词时很顺手,比如 `\b(\w+)\s+\1\b`。
先行(lookahead)与后行(lookbehind)怎么用、用来做什么?
lookaround 是零宽断言——只检查某个东西匹配(或不匹配),但不消耗字符。`(?=foo)`(正向先行)表示当前位置之后跟着 `foo`;`(?!foo)`(负向先行)表示后面不是 `foo`。`(?<=foo)` 与 `(?
为什么我的 regex 把浏览器卡住了?什么是灾难性回溯?
灾难性回溯(catastrophic backtracking)发生在 pattern 有嵌套量词、外加重叠的备选时,经典形状是 `(a+)+`、`(a|aa)+`、`(\w*)*` 或 `(?:a|a?)+`。当输入恰好在最后一个字符上让匹配失败时,引擎会尝试指数级数量的分组划分才放弃。比如 `(a+)+b` 跑 `aaaaaaaaaaaaaaaaaaaaab`,大约要 2^21 ≈ 200 万次回溯才能给答案。本测试器把每次 match 调用都裹进一个 250 毫秒的 wall-clock 预算——预算超了就停止迭代,并显示「Pattern timed out」警告。修法:给 pattern 加边界锚(`^...$`);改成不重叠的备选(用 `(a|b)` 代替 `(a|aa)`);展平嵌套量词(用 `a+` 代替 `(a+)+`);或者用类 atomic 的写法重写(`(?=(a+))\1` 在 JS 里能模拟 `a++`)。
这个 regex tester 和 regex101.com 有什么不同?
三点不同。(1) 隐私:regex101 把每次按键都送到后端做评估,pattern 还会进社区共享链接的数据库;本工具完全在浏览器里跑,零网络调用。(2) 速度:服务端往返每次改动会多花 80-300ms;这里匹配在 10ms 以内完成,文本再长也一样。(3) 方言侧重:regex101 在带 feature flag 的 UI 下支持 PCRE、Python、Java、.NET、JavaScript、Rust、Go;本工具只聚焦 ECMA-262(JavaScript)——每个浏览器、Node、Deno、Bun 都内置的那一种——解释器和分享链接都为这一种方言调校过。如果你需要 PCRE 特有的功能,regex101 仍是合适选择;若是 JavaScript / TypeScript 工作流,本工具更快、更隐私。这里的「分享链接」是 URL 哈希(不会上传),别人打开后会在他们本地重建你的 pattern。
怎么转义 . | ( ) [ ] { } * + ? ^ $ \ 这些特殊字符?
前面加个反斜杠就行:`\.`、`\|`、`\(`、`\)`、`\[`、`\]`、`\{`、`\}`、`\*`、`\+`、`\?`、`\^`、`\$`、`\\`。正斜杠 `/` 在字符串形式的 pattern 里不需要转义(只有 JS regex 字面量两条斜线之间才需要)。在字符类 `[...]` 内部,大部分元字符失去特殊含义,所以 `[.]`、`[*]`、`[+]` 都匹配字面量字符——字符类里仍然特殊的只有 `]`、`\`、行首位置的 `^`(用于否定),以及两个字符之间的 `-`(表示范围)。拿不准时,直接把字面文本贴进 pattern,跑一下解释器:每个转义序列在分解面板里都会有一行说明。
我能用一个链接把 regex 分享给同事吗?
可以——而且链接里没有任何服务端往返。点击操作栏的「Copy link」:测试器会把你的 pattern、flag、测试文本、当前标签都编码进 URL 哈希(`#p=...&f=gim&t=...&tab=match`)。打开链接的人会在他们本地重建出同样的状态。因为数据放在哈希 fragment 里,浏览器永远不会把它发到 go-tools.org 服务器(浏览器不会在请求中传 fragment),我们的访问日志也看不到。链接长度会随文本增长,所以文本超过 2KB 时,建议用「Copy /pattern/flags」拷贝 regex,再单独把文本贴过去。如果只想做 regex 评审、不愿分享真实文本,只发 pattern + flag 就够了——对方贴自己的语料也能得到同样的匹配。
测试器支持 Unicode、emoji 和非拉丁文字吗?
支持。打开 /u flag 就启用完整的 Unicode 处理:\w 默认仍然是拉丁单词字符(语义不变),但 /u 下可以用 Unicode 属性转义匹配更广的类别——`\p{Letter}` 匹配任何文字系统的字母,`\p{Script=Han}` 匹配汉字,`\p{Emoji}` 匹配 emoji,`\p{Number}` 匹配任意数字/数符。不开 /u 时,像 👨‍💻 这种代理对 emoji 会被当成两个 UTF-16 码元,`^.$` 这类 pattern 匹配不到;开了 /u,点号把每个字位码点当一个字符。RTL 文字(阿拉伯文、希伯来文)不需要特殊处理——方向是渲染层的事,regex 引擎不关心。CJK 内容的匹配方式与拉丁字符完全一致。
.match、.matchAll、.replace、.split 配 regex 用时有什么区别?
String.prototype.match 返回首个匹配(开了 /g 时返回所有匹配的数组),但开 /g 时会丢失捕获组。String.prototype.matchAll 必须配 /g,返回一个迭代器,每项都是带捕获组和 indices 的匹配数组——本测试器内部用的就是它。String.prototype.replace 接受字符串模板($1、$& 等)或回调(参数依次为 match、...groups、offset、string、namedGroups)。String.prototype.split 按每次匹配切分——和 /g 搭配很有用,不过 split 的语义里全局 flag 会被忽略。本工具用 Match 标签暴露 match、Replace 暴露 replace、Split 暴露 split,让你在不离页的情况下预览每种用法;想贴进代码时,规范化的 /pattern/flags 字面量一键复制即可。
为什么我的 Python 或 Java regex 在这里跑不起来?
因为本测试器跑的是 ECMA-262(JavaScript)——大多数 pattern 移过来不需要改,但少数会卡住。常见移植坑:(1) Python 的行内 flag `(?i)`、`(?x)` 在 JS 里不合法——请用上方 flag chip 切换。(2) Python 的 `\A` 与 `\Z` 在 JS 里就是 `^` 与 `$`(行锚需配 /m)。(3) Java/Python 的条件分支 `(?(name)yes|no)` 在 JS 不支持——用 alternation 改写。(4) 占有量词 `a++` 和 atomic group `(?>...)` 在 JS 没有——用 `(?=(a+))\1` 模拟。(5) Python 的 `(?P...)` 在 JS 写作 `(?...)`。(6) `\h`(水平空白)、`\v`(垂直空白)在 JS 里不存在——分别用 `[ \t]` 和 `[\n\r]`。要做可移植的迁移,解释器会拆解每个 token 在做什么,你照着把不支持的写法替换成等价表达即可。
测试文本或匹配数量有上限吗?
实用上限:测试文本约 200,000 字符、同时高亮显示约 500 条匹配。超过 500 条时,匹配面板会显示「Showing first 500」横幅;计数 badge 仍报告真实总数。无论文本多大,250 毫秒 wall-clock 预算都会兜底失控 pattern。处理几 MB 的日志文件时,请直接用命令行 `grep -oE` 或 `rg`(ripgrep)——它们是流式的,不会受 UI 渲染上限影响。要对超大文本做一次性扫描,先在本测试器里贴一段有代表性的切片验证 pattern,再把验证过的 pattern 丢回 shell 跑全文件。