正则测试
一边写一边看命中,错了立刻报错。
/
/
关于卡死
这里设了 5000 次命中上限,防止「命中数量爆炸」把页面拖死。但它挡不住单次匹配的灾难性回溯——比如 (a+)+$ 匹配一串几乎相像但不匹配的字符时,浏览器没有正则超时机制,页面仍会卡住,只能关闭标签页。写正则时警惕嵌套量词。
什么时候用
- 写日志解析或表单校验的正则时,边改边看每处命中的位置和捕获组编号,确认分组有没有被括号的位置带偏。
- 调试 g 标志下的零宽匹配与 lastIndex 行为(^、\b、空匹配),看 regex 引擎会不会在同一位置反复命中、需不需要手动推进。
什么时候不用
- 正则来自不可信来源(用户自定义规则),或待匹配文本超过 1MB:JS 在主线程同步执行,没有超时也无法中断,灾难性回溯会直接把标签页冻住。
- 需要 PCRE/PCRE2 的特性(\A、\z、原子组 (?>)、条件、递归),或想直接看替换、分割的结果:JS RegExp 语法不同也不支持这些,请用最终要部署的那个引擎测。
限制与隐私
匹配与高亮在浏览器本地完成,文本不上传。限制:用 JS 原生 RegExp 而非 PCRE;只有 g、i、m、s 四个标志;5000 次上限只防结果爆炸,防不了单次匹配的灾难性回溯,也没有超时中断;文本建议 1MB 以内。
常见问题
正则会不会把页面卡死?
会,而且这里的 5000 次上限挡不住。上限限制的是命中次数,防的是短模式在长文本上产出海量结果;真正致命的是单次匹配内部的灾难性回溯,比如 (a+)+$ 遇到一长串 a、末尾再接一个匹配不上的字符,耗时随长度指数增长。浏览器没有正则超时,主线程只能一直算到结束,中途关标签页是唯一办法。写的时候避免嵌套量词、把 .* 换成更具体的字符类、先限制文本长度。
支持哪些标志?为什么没有 u 和 y?
目前是 g、i、m、s:全局、忽略大小写、多行、点号匹配换行。u(Unicode 码点)、y(粘性)、d(返回 indices)、v(Unicode 集合)没有做开关,需要时得在控制台自己 new RegExp。注意 u 会改变转义和量词的行为,带 emoji 或 \p{...} 的写法在非 u 模式下可能一处都匹配不到。
捕获组显示「未匹配」是什么意思?
表示这一组没有参与匹配,值在 JS 里是 undefined,不是空字符串。常见于可选组 (a)? 或没走到的分支。高亮和 replace 的表现可能不一致:replace 里 undefined 的组会变成空串,所以判断时要用 !== undefined,用真假值判断会把合法的空匹配误判成未匹配。