使用方法
- 在上方输入表达式,不需要写两侧的斜杠。
- 按需切换标志。g 默认开启;不开的话只会找到第一个匹配。
- 粘贴测试文本,匹配会随输入实时高亮。
- 填写替换内容可预览结果——
$1引用编号组,$<name>引用命名组。
关于正则表达式,以及那个真正会咬人的地方
正则描述的是一种模式而非固定字符串,匹配引擎的工作方式是不断尝试各种可能,失败了就回退 重来。这种回溯正是正则表达力的来源,也是唯一一个值得真正理解的失效模式的根源。
以 (a+)+b 匹配 aaaaaaaaaaaaaaaaaaaaaaaaaaaa 为例。字符串里没有 b,匹配注定失败——
但在得出这个结论之前,引擎会尝试把这些 a 在内外两层量词之间切分的每一种方式。每多一个
字符,切分方式就翻一倍,到三十个 a 时引擎要走过数以亿计的可能。这就是灾难性回溯,
它确实搞垮过生产系统:日志解析规则里的一条正则遇上一行异常输入,是有据可查的事故模式。
而它在浏览器里格外危险的原因是:JavaScript 无法中断正在运行的正则。没有超时参数、 没有取消机制、其他代码也拿不到执行权。一个在主线程上回溯的表达式会让标签页彻底冻住—— 不能滚动、不能点击、也停不下来。多数在线正则工具都是这么做的,于是一个用来做实验的表达式, 能把你正在做实验的那个页面本身弄死。
本工具把匹配放在 Web Worker 里执行并设有时限。Worker 是独立线程,它工作时页面保持 响应;超过时限仍未结束,整个 Worker 会被终止。这个终止是唯一可靠的止损手段——没有任何 办法能让一段正在回溯的正则自己停下来。
结果上方那个形状提示是一个启发式判断,它查找嵌套量词。它刻意不做拦截:一个表达式是否真的 会爆炸取决于输入,而严格判定这件事在一般情况下不可判定。提示告诉你该往哪里看,真正保护你 的是超时。