一条正则引发的线上事故
校验邀请码的正则写成 ^[A-Z]{3}$,测试用 ABC 全过,上线后 ABCD 也过了——少了锚点。加回 ^ $ 后,再测:aaa 不匹配(小写)、aaaa 不匹配(四个 a)、aaa 匹配。量词 {3} 的含义是"恰好三次",多一个少一个都失败,这个边界性质是正则测试的第一课。
正则的边界测试法
- 正常样本:完全符合规则的输入,必须匹配
- 边界样本:刚好触到规则边缘(长度刚好、字符刚好)
- 越界样本:超一位、少一位、错一位,都必须拒绝
- 畸形样本:空串、超长串、特殊符号混合
量词的三档语义
a{3} 是恰好三次、a{3,} 是至少三次、a{3,6} 是三到六次——三者边界不同:aaaa 对 a{3} 不匹配、对 a{3,} 匹配、对 a{3,6} 匹配;aaaaaaa(七个)则只有 a{3,} 还匹配。写完正则把这三档各测一遍,能抓住八成的量词错误。
常见问题
- 测试通过为什么线上失配?
- 多为样本覆盖不足:只测了正常样本没测越界样本,或不同语言的正则方言有差异。
- * 和 *? 有什么区别?
- 贪婪与惰性:a.*b 吃到最后一行的 b,a.*?b 停在第一个 b,长文本结果完全不同。
- 正则会卡死吗?
- 嵌套量词可能灾难性回溯,线上输入加长度限制是必要的护栏。
正则的可信度来自测试样本的刁钻程度——越界样本比正常样本更值钱。