在线正则表达式测试工具,支持 g/i/m/s 等 flags。实时显示匹配结果和高亮。浏览器本地执行,快速调试 Regex。
摘要:免费的正则表达式测试器,支持 g/i/m/s flags,实时高亮匹配结果,本地运行无需注册。
本地工具可在 DevTools → Network 搜索输入内容,通常不会出现在请求中。
下一步
使用指南
在浏览器里实时测试正则表达式:输入 pattern 与测试文本,命中结果即时高亮,捕获组、命名分组与全局/多行/忽略大小写标志可视化展示。正则引擎的差异(JavaScript、Java、Python、PCRE)经常让「本地能跑线上不行」,本工具按 JavaScript 语义执行并标注跨语言差异点。
1. 五个标志位的作用与陷阱
- g(全局):matchAll 与 replace 的基础;但 RegExp.prototype.test 配 g 会推进 lastIndex——同一个正则对象连续 test 出现「时真时假」就是这个原因。
- i(忽略大小写):Unicode 场景下注意 i 配 u 标志才对非 ASCII 字符稳定。
- m(多行):只影响 ^ 与 $ 的行锚定;不影响点号(点号跨行需要 s/[sS])。
- s(dotAll):让 . 匹配换行——JavaScript ES2018 后可用;老环境用 [sS] 替代。
- u(Unicode):p{...} 属性匹配的前提;处理中文与 Emoji 时建议常开。
2. 贪婪、懒惰与回溯灾难
量词默认贪婪:a.*b 对字符串 a x b x b 会一路吃到行尾再回退,最终匹配到最长的 a...b。加问号变懒惰(.*?)则匹配最短命中。绝大多数正则性能问题来自灾难性回溯:嵌套量词((a+)+b)在「几乎匹配但差一点」的输入上让回溯组合数指数爆炸,浏览器直接卡死。防御方式:明确量词边界([^<>]+ 优于 .+)、用原子组(部分引擎支持)或占有量词(++,JavaScript 暂不支持时改写结构)、以及永远对不可信输入加长度与字符集预检。
3. 捕获组与命名分组的工程价值
- 普通捕获组 (expr) 按左括号顺序编号,match 返回数组里第 1 项开始是各组内容。
- 命名分组 (?<year>d{4}) 让 replace 与语义绑定:$<year> 年 $<month> 月,可读性远超 $1/$2。
- 非捕获组 (?:expr) 只分组不捕获——不需要引用时务必加 ?:,省内存也避免编号错位。
- 在工具里开启命名分组显示,逐组核对实际捕获内容,是排查「正则没抓到」的最快路径。
4. 跨语言正则差异备忘
同一份 pattern 在不同引擎里行为并不相同:JavaScript 不支持递归与 K;Java 的反斜杠在字符串字面量里要双写(\d);Python 的 re 默认不支持原子组,regex 第三方库才支持;PCRE 与 Go(RE2)线性时间但禁用回溯引用。把在工具里验证过的 JavaScript 正则迁移到后端语言时,先查这张差异清单再上线,能省掉一批「本地好好的」线上 bug。
5. 日常高频正则片段
- 数字:整数 ^-?d+$;保留两位小数 ^-?d+.d{1,2}$;千分位插入 replace(/B(?=(d{3})+(?!d))/g, ',')。
- 中文字符区间:[一-龥](基本区);全角标点另算。
- URL 提取:https?://[^s)>]]+ 粗匹配够用,严格校验请用 URL 构造器而不是正则。
- 密码强度三元检查:/(?=.*[a-z])(?=.*[A-Z])(?=.*d).{8,}/ ——先断言后消费。
- 去除首尾空白:replace(/^s+|s+$/g, ''),语义等价 trim 且兼容旧环境。
6. 测试正则的正确姿势
至少准备四类用例:应命中的标准样例、应命中的边界样例(空串、单字符、最大长度)、不应命中的近似样例(多一个符号、全角半角差异)、以及对抗样例(灾难性回溯触发串)。把这套用例固化成单元测试,正则的每次修改都跑一遍——正则是「写起来快、改起来怕」的典型,用例是唯一的安心来源。
常见问题
本页只跑浏览器的 JavaScript RegExp,不是 PCRE、Python re、Go RE2 或 .NET,页面顶部有「JavaScript RegExp only」标注。JavaScript 不支持递归与 (?(cond))、没有 \K、也暂不支持占有量词——这些是跨方言迁移时最常见的差异点。
支持 g、i、m、s、u、y,可自由组合。注意三点:m 只改变 ^ 和 $ 的行锚定,点号要跨行匹配得靠 s 或 [\s\S];\p{...} Unicode 属性匹配必须开 u,处理中文与 Emoji 建议常开;同一个带 g 的正则对象连续调 test 会推进 lastIndex,「时真时假」就是这个原因。
多半是灾难性回溯:嵌套量词(如 (a+)+b)在「几乎匹配但差一点」的输入上让回溯组合数指数爆炸。防御:用 [^<>]+ 这类受限字符集代替 .+、对不可信输入加长度预检;JavaScript 暂不支持占有量词,必要时改写结构。上线前先拿对抗样例在工具里压一遍。
命名分组 (?<year>\d{4}) 在 replace 里用 $<year> 引用,可读性远超 $1/$2;现代浏览器同时支持可变长 lookbehind((?<=...) / (?<!...))。不需要引用的分组记得写成非捕获 (?:expr),省内存也避免编号错位。开启命名分组显示后可逐组核对实际捕获内容,是排查「正则没抓到」的最快路径。
同一份 pattern 在不同引擎行为并不一致:Java 的反斜杠在字符串字面量里要双写(\d 要写成 \\d);Python 的 re 默认不支持原子组,第三方 regex 库才支持;PCRE 与 Go(RE2)线性时间但禁用回溯引用。迁移前对照这份差异清单过一遍,能省掉一批「本地好好的」线上 bug。
全部处理都在本机浏览器完成:匹配、高亮、捕获组解析不产生网络请求,你的文本与 pattern 不发往任何服务器。