先转义,还是先匹配?
手写 Markdown 渲染器时遇到一个诡异问题:引用块(> 开头)怎么都不渲染,标题、列表却一切正常。
排查过程
正则写了 /^> (.*)$/gm,测试字符串单独跑没问题,一进流水线就失效。
打了几次日志才发现:流水线是先做 HTML 转义,再做块级匹配。> 在转义后变成了 >,后面的正则自然永远匹配不上。
根因
原文: > 引用一句话
转义后: > 引用一句话
正则: /^> / ← 永远落空
修复方法很直接:匹配规则写成转义后的形态 /^> ?/。
教训
- 流水线里每一步的输出是下一步的输入,规则要对着自己那一步的真实输入写
- 单元测试单独测正则,集成测试测整条流水线,两者缺一不可
- 偶发问题先怀疑时序,再怀疑缓存
这类「顺序依赖」的 bug 最折磨人,因为每一环单独看都是对的。