实战指南 5 分钟阅读

用 AI 生成正则后,如何验证边界样例

从自然语言生成 JavaScript 正则只是第一步;本文演示如何设置 flags、准备正反样例并识别过度匹配和灾难性回溯风险。

AI 可以把自然语言快速转换为正则候选,但它不知道你的完整输入边界、目标正则引擎和失败样例。可靠的工作流应该是“描述需求、生成候选、补充样例、验证结果”,而不是生成后直接复制到生产代码。

先把需求写得可验证

“匹配 GitHub 链接”过于宽泛。更好的描述是:

使用 JavaScript 正则匹配完整 URL;协议必须是 https;主机名必须恰好为 github.com;路径必须以 .md 结尾;不允许 query 参数。

正则表达式测试工具的“AI 辅助生成”区域输入描述,点击“生成正则”。描述会发送到 DevToolbox API 和 Cloudflare Workers AI,生成结果会自动填入上方正则输入框。

AI 可能返回下面这个候选:

^https:\/\/github\.com\/.*\.md$

它看起来合理,但是否符合需求只能通过样例确认。

同时准备应该通过和应该失败的样例

把这些文本放进“测试文本”区域:

https://github.com/openai/openai-node/blob/master/README.md
https://github.com/example/demo.md
http://github.com/example/demo.md
https://evilgithub.com/example/demo.md
https://github.com/example/demo.md?raw=1

前两行应该匹配,后三行应该失败。页面会高亮匹配片段,并列出匹配位置和捕获组。只测试成功样例,很容易漏掉过度匹配。

flags 会改变结果

工具支持 JavaScript 的 gimsuy flags:

  • g 查找全部匹配;关闭后只返回第一次匹配。
  • i 忽略大小写。
  • m^$ 可以匹配每一行的开头和结尾。
  • s 让点号也匹配换行符。
  • u 启用 Unicode 模式。
  • y 从上一次匹配结束位置继续进行粘连匹配。

对“每一行都是一个完整 URL”的样例,需要启用 gm。复制正则时也要同时记录 flags,仅复制表达式主体可能改变运行结果。

AI 不能替代性能和安全检查

包含多层量词的表达式,例如 (a+)+$,在特定失败输入下可能触发灾难性回溯,造成明显的 CPU 消耗。当前页面负责使用浏览器的 JavaScript 正则引擎执行样例,但不会证明表达式在所有输入长度下都安全。

用于路由、权限判断或输入验证时,还应当:

  1. 限制待匹配字符串长度。
  2. 加入空字符串、超长字符串、Unicode 和换行等边界样例。
  3. 在目标运行时执行单元测试,因为不同语言的正则语法并不完全一致。
  4. 对安全敏感格式优先使用成熟解析器,而不是不断扩张一条复杂正则。

AI 的价值是减少起草时间;正反样例和目标环境测试才决定这条正则是否可用。