正则表达式测试工具
实时高亮匹配、查看捕获组、预览替换结果——全部在你的浏览器里完成正则表达式测试。
引擎:由浏览器运行的 JavaScript (ECMAScript) 正则表达式。行为可能与 PCRE、Python、Go、Java 或 .NET 有所不同。
解释表达式
输入一个表达式,即可逐个片段查看解释。
常用表达式库
点击某个表达式,即可将其(连同示例文本)加载到测试器中。
每行一个用例。如果表达式必须匹配,以“+ ”开头;必须不匹配,则以“- ”开头(此处会忽略 g 和 y 标志)。
生成代码
输入表达式即可生成代码。
表达式会按原样复制(仅调整命名分组、标志和替换标记)。请在目标引擎中检查后行断言、反向引用和 Unicode 的支持情况。
- \d — 任意数字(0–9)
- \w — 任意单词字符(字母、数字、下划线)
- \s — 任意空白字符
- . — 除换行符外的任意字符
- ^ — 字符串开头(开启 multiline 标志时为每行开头)
- $ — 字符串结尾(开启 multiline 标志时为每行结尾)
- * — 前一个标记出现零次或多次
- + — 前一个标记出现一次或多次
- ? — 前一个标记出现零次或一次
- {n,m} — 重复次数介于 n 到 m 之间
- (...) — 捕获组,(?:...) — 非捕获组
- \b — 单词边界,| — 或(多选一)
在浏览器里测试正则表达式,到底是怎么运作的?
正则表达式是一种非常精简的文本匹配语言——从判断“这看起来像不像一个邮箱地址”,到“找出这份文档里所有的电话号码”,再到“把这段字符串里的 HTML 标签全部去掉”,几乎无所不能。麻烦的是,正则表达式的写法特别容易在不知不觉中出错:一个本该转义却没转义的 `.`,一个贪婪过头、吞掉了不该匹配内容的 `*`,一个捕获到的内容和你预期完全不一样的分组。如果凭感觉写完就直接扔到生产环境里跑,等到出错才发现问题所在,这个教训学起来代价不小。
这个工具完全基于 JavaScript 自带的 `RegExp` 引擎运行,你一输入它就在浏览器里直接执行——不经过任何服务器,所以无论你测试的是什么文本(真实用户数据、日志内容,或者任何你不想贴到第三方服务里的东西),都不会离开你的设备。因为用的正是你的 JavaScript 代码在生产环境中会用到的同一个引擎,这里看到的结果——哪些字符被匹配、贪婪量词的具体行为、某个分组到底有没有捕获到内容——都和运行时的真实结果完全一致,而不是来自某种“方言版”正则引擎的近似模拟。
输入一个正则表达式,然后打开你需要的标志:`g` 用来查找所有匹配项而不是只停在第一个,`i` 用于忽略大小写,`m` 让 `^` 和 `$` 匹配每一行的开头/结尾而不是整段文本,`s` 则让 `.` 也能匹配换行符。测试文本里的每一处匹配都会实时高亮显示,下方还会把每个匹配项拆解成完整匹配文本、所在位置,以及任何捕获组——包括像 `(?<year>\d{4})` 这样的命名分组——这样你可以立刻确认自己想提取的分组,是不是真的捕获到了预期内容。“替换”区域会精确展示用你的正则表达式和替换字符串执行 `String.replace()` 会得到什么结果,包括 `$1` 或 `$<year>` 这类分组反向引用。
下方的速查表整理了大家写正则时最容易忘记的那些符号——`*` 和 `+` 到底有什么区别、非捕获组 `(?:...)` 是用来干什么的、`\b` 又是怎么标记单词边界的——不用离开页面去查资料。当你用真实的测试数据把正则表达式调试到符合预期,就可以直接拿去用在代码里了。如果还需要校验或重新整理周边的数据本身,JSON 格式化与校验工具、文本对比工具都是很合适的搭档。
常见问题
写得不好的正则表达式会让页面卡死吗?
不会——匹配在单独的 Web Worker 中运行,并有强制超时,因此即使是会引发灾难性回溯的表达式,也不会锁死你的标签页。
会显示命名分组和编号分组吗?
会——每个匹配都会列出编号分组,以及像 (?<year>\d{4}) 这样的命名分组。
在代码中使用之前,能预览替换结果吗?
能——“替换”面板会准确显示 String.replace() 的输出,包括分组反向引用。