免费正则表达式测试器 — 在线实时匹配与调试
在浏览器里实时测试正则表达式:高亮匹配、捕获组、命名分组、替换预览、字符串切分与逐 token 解释,支持 JavaScript(ECMA-262)方言、g/i/m/s/u/y/d 七个 flag、ReDoS 超时保护。100% 本地运行、免费、无需注册。
我们对照 ECMA-262 规范、Node.js RegExp 行为,以及 V8 / JavaScriptCore / SpiderMonkey 的跨引擎一致性测试来校验 regex 输出。ReDoS 预算的阈值基于 Snort 与 OWASP regex-DoS 语料里有据可查的最差 pattern 校准而成。
什么是正则表达式测试器?
正则表达式测试器(regex tester)是一类工具:写一段 pattern、贴一段测试文本,立刻看到 pattern 实际匹配到了什么——附带捕获组、替换预览和 flag 解释——完全不需要重新编译代码或运行脚本。对开发者而言,它把调试循环从分钟级压到毫秒级:改改 pattern、看着高亮移动、放心发车。
正则表达式是一种用来描述文本模式的紧凑语言。\d+ 匹配一个或多个数字。[A-Za-z_]\w* 匹配一个典型的标识符。(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) 匹配 ISO 日期并给每一部分起好名字。正则表达式是每个代码编辑器里查找替换的脊梁、每个表单里校验的底座、每个可观测性栈里日志解析的内核,也是 grep、sed、awk 这些半个互联网都在用的 Unix 工具的基础。它们同时也以「写对很难」著称:偏一位的量词、漏掉的转义,会让 pattern 匹中错误子串、漏掉真实匹配,或者——最糟的情况——触发灾难性回溯把一颗 CPU 整核劫持。一个好的 regex tester 能在这些失败模式进生产之前把它们逮住。
本测试器跑的是每个现代浏览器内置的原生 ECMA-262 RegExp 引擎——和你在 JavaScript、TypeScript、Node.js、Deno、Bun 里调用的是同一套。也就是说,支持:捕获组(数字编号与 (?<name>...) 命名分组)、先行与后行断言((?=...)、(?!...)、(?<=...)、(?<!...))、七个规范 flag(g、i、m、s、u、y、d)、/u 下的 Unicode 属性转义(\p{Letter}、\p{Script=Han}),以及 \d 之类的字符转义。在这里验证过的 pattern 贴进代码库就能跑,不需要改。如果你从 PCRE、Python 或 Java 移植过来,解释器会拆解每个 token,让你一眼看出哪些写法没法直接翻译(atomic group、占有量词、行内修饰符)。
除了原始匹配之外,测试器还把哪些信息呈现出来:「匹配与捕获组」面板列出每条匹配的 [start, end) 偏移与各捕获组的值——与你从 String.prototype.matchAll 配合 /d flag 拿到的信息一致,只是为视觉扫读做了排版。Replace 标签提供实时替换预览,支持完整的 $1 / $& / $` / $' / $$ / $<name> 模板字母表——恰好就是 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) 偏移、完整匹配文本,以及内部所有位置分组与命名分组。命名分组以 $<name> 标注,让你在面板里读到的数据和将来在代码里消费时长得一样。
实时 Replace 预览($1 / $& / $<name>)
切到 Replace 标签,替换效果实时呈现。完整的 ECMAScript 替换字母表全部生效:$1..$N 取位置分组、$<name> 取命名分组、$& 取整段匹配、$` 与 $' 取前缀/后缀、$$ 输出字面量美元。输入与输出并排,一键复制。
按 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 命名分组会以 $<year>、$<month>、$<day> 的形式出现在右侧面板。切到 Replace 标签,试一下 $<day>/$<month>/$<year>,一遍就能把 ISO 日期改写成 DMY 顺序——在任意现代 JS 引擎的 replace 调用里也是一样的写法。
用 $1 反向引用做查找替换
(\w+) (\w+)
替换模板:$2, $1 → Jack Doe → Doe, Jack
两个无名捕获组,替换模板 $2, $1,Replace 标签给你一个实时预览。$&、$`、$'、$$、$<name> 全部支持——就是 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
把 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) 偏移、完整匹配文本与每个捕获组的值(命名分组以 $<name> 标注)。
- 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']
贪婪量词吃太多
.+ 会尽可能多地吞字符,所以 <.+> 跑在 <a> and <b> 上会命中 <a> and <b>,而不是 <a>。换成懒量词(.+?)、收紧字符类([^>]+),或用 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、$&、$
、$'、$$、$<name> 是手写解析的,而不是直接交给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,除非你有具体理由不开。 - 给捕获组起名字
(?<year>\d{4})-(?<month>\d{2})是自带说明的。半年后回头看这段 regex,m.groups.year一眼能知道是年——m[1]不行。带 $<name> 的替换模板也对分组顺序调整免疫:一旦有人在中间加一个新分组,位置模板会立刻爆掉。- 测失败用例,而不只是成功用例
- regex tester 真正的用处是验证失败。先确认 pattern 匹中了什么,再故意改测试文本看它没匹中什么——前导空白、末尾空白、缺字段、多字段、大小写错、多语种混杂。只能 happy path 通过却放过垃圾输入的 pattern,是生产上最先被 user 暴出来的那种 bug。
常见问题
我输入的正则或测试文本会被发到服务器吗?
这个测试器用的是哪个 regex 方言——PCRE、Python、Java 还是 JavaScript?
new RegExp(pattern, flags) 拿到的引擎完全一致。所以支持的特性包括:捕获组(数字编号 + (?<name>...) 命名分组)、零宽断言中的先行 (?=...) 与 (?!...)、后行 (?<=...) 与 (?<!...)、g/i/m/s/u/y/d 七个 flag、/u 下的 Unicode 属性转义(\p{Letter})、\1..\9 反向引用。PCRE 独有的特性,比如 atomic group (?>...)、占有量词 a++、条件分支 (?(1)yes|no)、行内修饰符 (?i),会抛出语法错。Python 的 re.VERBOSE 这里也不支持。需要 Python/Java/Go 的 regex 时,把 pattern 移回原生引擎——大多数简单 pattern 不需要任何修改即可迁移,本工具的解释器也是方言中立的。 g、i、m、s、u、y、d 这几个 flag 分别是什么作用?
.indices 与 .indices.groups 的 [start, end] 对;本测试器内部默认开 /d 以便画出分组边界。在测试文本上方的 chip 上点一下即可切换;右侧 readout 会显示规范化后的 /pattern/flags 字面量。 怎么写捕获组?怎么回引它们?
(\d{4})-(\d{2})-(\d{2}) 给你三个位置分组,替换里写 $1、$2、$3,匹配面板里也能看到 m.groups[0..2]。命名分组用 (?<name>...):(?<year>\d{4})-(?<month>\d{2}) 让你在替换模板里写 $<year>/$<month>。(?:...) 是非捕获分组,仅用于配合量词或 alternation(比如 (?:foo|bar)+),它不会产生反向引用,能让你的 $1..$N 编号保持稳定。要在同一个 pattern 内回引先前的捕获,用 \1、\2 等——找重复词时很顺手,比如 \b(\w+)\s+\1\b。 先行(lookahead)与后行(lookbehind)怎么用、用来做什么?
(?=foo)(正向先行)表示当前位置之后跟着 foo;(?!foo)(负向先行)表示后面不是 foo。(?<=foo) 与 (?<!foo) 是对应的后行版本。实战用途:在不把上下文吃进匹配的前提下提取子串((?<=\$)\d+ 匹配美元符号之后的数字,但 $ 本身不算进匹配里);在一个 pattern 里同时验证多个约束((?=.*[A-Z])(?=.*\d).{8,} 要求至少一个大写、一个数字、长度 8);禁止某种出现(^(?!.*\bpassword\b) 拒绝任何含 password 一词的行)。现代 ECMA-262 已支持变长后行,所以 (?<=^prefix-?) 是合法的。 为什么我的 regex 把浏览器卡住了?什么是灾难性回溯?
(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 有什么不同?
怎么转义 . | ( ) [ ] { } * + ? ^ $ \ 这些特殊字符?
\.、\|、\(、\)、\[、\]、\{、\}、\*、\+、\?、\^、\$、\\。正斜杠 / 在字符串形式的 pattern 里不需要转义(只有 JS regex 字面量两条斜线之间才需要)。在字符类 [...] 内部,大部分元字符失去特殊含义,所以 [.]、[*]、[+] 都匹配字面量字符——字符类里仍然特殊的只有 ]、\、行首位置的 ^(用于否定),以及两个字符之间的 -(表示范围)。拿不准时,直接把字面文本贴进 pattern,跑一下解释器:每个转义序列在分解面板里都会有一行说明。 我能用一个链接把 regex 分享给同事吗?
#p=...&f=gim&t=...&tab=match)。打开链接的人会在他们本地重建出同样的状态。因为数据放在哈希 fragment 里,浏览器永远不会把它发到 go-tools.org 服务器(浏览器不会在请求中传 fragment),我们的访问日志也看不到。链接长度会随文本增长,所以文本超过 2KB 时,建议用「Copy /pattern/flags」拷贝 regex,再单独把文本贴过去。如果只想做 regex 评审、不愿分享真实文本,只发 pattern + flag 就够了——对方贴自己的语料也能得到同样的匹配。 测试器支持 Unicode、emoji 和非拉丁文字吗?
\p{Letter} 匹配任何文字系统的字母,\p{Script=Han} 匹配汉字,\p{Emoji} 匹配 emoji,\p{Number} 匹配任意数字/数符。不开 /u 时,像 👨💻 这种代理对 emoji 会被当成两个 UTF-16 码元,^.$ 这类 pattern 匹配不到;开了 /u,点号把每个字位码点当一个字符。RTL 文字(阿拉伯文、希伯来文)不需要特殊处理——方向是渲染层的事,regex 引擎不关心。CJK 内容的匹配方式与拉丁字符完全一致。 .match、.matchAll、.replace、.split 配 regex 用时有什么区别?
为什么我的 Python 或 Java regex 在这里跑不起来?
(?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<name>...) 在 JS 写作 (?<name>...)。(6) \h(水平空白)、\v(垂直空白)在 JS 里不存在——分别用 [ \t] 和 [\n\r]。要做可移植的迁移,解释器会拆解每个 token 在做什么,你照着把不支持的写法替换成等价表达即可。 测试文本或匹配数量有上限吗?
grep -oE 或 rg(ripgrep)——它们是流式的,不会受 UI 渲染上限影响。要对超大文本做一次性扫描,先在本测试器里贴一段有代表性的切片验证 pattern,再把验证过的 pattern 丢回 shell 跑全文件。 相关工具
查看所有工具 →大小写转换器 — UPPERCASE、lowercase、camelCase 一次搞定
文本处理
在浏览器里把文本一键转成 UPPERCASE、lowercase、Title Case、Sentence case、camelCase、PascalCase、snake_case、kebab-case、CONSTANT_CASE 等共 15 种命名格式。免费、纯本地、无需注册。
Lorem Ipsum 生成器 — 免费占位文本工具
文本处理
即时生成 Lorem Ipsum 占位文本 — 按段落、句子、单词、字节或列表生成。可复制或下载为纯文本、HTML、Markdown 或 JSON。100% 免费、隐私、纯浏览器运行,无需注册。
在线从文本中删除重复行
文本处理
在线从文本中删除重复行——免费、即时、100% 在你的浏览器里完成。可忽略大小写或空白,保留首次或末次出现,并显示删除了多少重复行。还能排序与清理。无需注册。
URL Slug 生成器 — 一键把任意文本转成 slug
文本处理
在线把任意标题即时转成干净、利于 SEO 的 URL slug。可音译重音字符与西里尔字母,也可保留 Unicode 文字。100% 本地运行,数据不离开浏览器。
按字母与自然顺序排序文本行
文本处理
在浏览器里对文本行排序:按字母顺序、数字顺序(自然排序)或行长度,升序或降序皆可。免费在线行排序工具,100% 纯本地运行。还能去重、反转与清理列表。无需注册,数据不上传。
在线文本对比与差异工具
文本处理
在浏览器内即时对比两段文本。双栏并排展示、行内单词级高亮、统一 diff 补丁导出,支持忽略大小写、空白与空行。100% 本地浏览器处理,无需上传,文本不离开你的设备。