跳到正文
加入会员

用 AI 生成正则表达式并建立反例测试集

阅读需要 5 分钟

以员工编号校验为例,完成规则澄清、正则生成、反例测试、运行时验证和回溯风险检查,避免只验证几个正确样本就上线,适合需要可复现流程与人工复核的团队直接照做。

字符样本沿正则路径前进,正确样本通过出口,错误样本被分支拦截

任务与最终结果

这次任务不是让 AI 随手给出一段看似复杂的表达式,而是把一条明确输入规则变成正则、正例、反例、边界样本和风险说明。以下以员工编号为例:输入必须是三个大写英文字母、一个连字符和四位数字,例如 ABC-2048;前后不得有空格,也不接受换行或小写字母。

小黑在字符粉笔迷宫中测试正例、反例和回溯路线

适用环境是 ChatGPT 当前网页版及目标语言的当前稳定运行时。截至 2026-08-30,应在自己的界面中确认所用模型,并核对 JavaScript、Python、Java、.NET 等运行时对锚点、Unicode、命名分组和回溯控制的差异。本文示例使用 JavaScript 语法,不代表可以原样复制到其他语言。

前提 本例选择 交付物
输入规则 三个大写字母、连字符、四位数字 可审阅的规则清单
目标运行时 JavaScript 正则及自动化样本
安全边界 限制输入长度,不解析嵌套语法 ReDoS 检查记录

先把自然语言变成无歧义约束

正则生成失败,通常不是模型不会写符号,而是需求里出现“数字”“字符”“允许空格”等模糊词。应先确定是否整串匹配、是否允许 Unicode 字母、是否区分大小写、最大长度是多少,以及空值由正则还是业务逻辑处理。MDN 的 JavaScript 正则表达式指南可用于核对字符类、量词、分组、断言和标志的实际含义。

如果经常处理同一语言,可以把“默认输出目标运行时、逐项解释并生成反例”等偏好写入 ChatGPT 自定义指令;具体入口可能随界面和套餐变化,应以当前页面为准。OpenAI 的自定义指令说明用于了解这项功能,但不要在其中保存项目密钥、内部样本或个人资料。

生成正则并要求 AI 自我对抗

  1. 冻结规则:写成编号清单,明确字符范围、位置、长度、空值和换行处理。不要只给三个正确示例让模型猜规律。
  2. 指定方言:明确要求 JavaScript 正则字面量,并让模型标注是否使用标志、前后锚点、捕获组或前瞻。
  3. 限制输出:要求先复述规则,再输出一个首选表达式、一个更易读的替代方案及差异;禁止自行扩展需求。
  4. 建立反例:让 AI 按错误类型生成样本,包括长度不足、长度超出、大小写错误、分隔符错误、前后空格、换行和相似 Unicode 字符。
  5. 提出攻击问题:要求寻找嵌套量词、重叠分支、无限输入和失败路径上的大量回溯,不接受一句“没有风险”作为结论。
目标运行时:JavaScript
规则:
1. 整个输入必须完全匹配。
2. 前三位仅允许 ASCII 大写字母 A-Z。
3. 第四位必须是连字符。
4. 后四位仅允许数字 0-9。
5. 不允许空格、换行或额外字符。
请输出:规则复述、首选正则、逐段解释、12 个应匹配样本、20 个不应匹配样本、边界样本、潜在回溯风险,以及可直接运行的测试代码。不要改变规则。

本例的简单候选可以是 /^[A-Z]{3}-[0-9]{4}$/。它只是针对上述固定格式的示范;如果输入可能含末尾换行,应结合目标运行时重新确认锚点语义,而不是仅凭视觉判断。

建立正例、反例与边界样本

类别 样本 预期 检查目的
典型正例 ABC-2048 匹配 基本路径
数字边界 ZZZ-0000 匹配 零值不被误拒绝
小写 AbC-2048 不匹配 大小写限制
错误分隔符 ABC_2048 不匹配 字面连字符
前置空格 ABC-2048 不匹配 整串匹配
额外后缀 ABC-2048X 不匹配 长度与结束位置
相似字符 ABC-2048 不匹配 全角字符

把这些样本保存为测试数据,而不是只留在对话中。运行时应逐条比较实际结果和预期结果,并在新增业务规则时保留旧反例,以防修正一个缺陷时放宽了另一个边界。

检查回溯风险再集成

OWASP 对 正则表达式拒绝服务(ReDoS)的说明指出,某些包含重复、分组和重叠匹配路径的表达式可能在恶意输入下消耗大量计算资源。因此要同时检查表达式结构和输入长度,不能把 AI 的安全评价当成证明。

  • 避免无必要的嵌套量词,例如重复组内部再次使用宽泛重复。
  • 为外部输入设置业务允许的最大长度,在进入正则前拒绝异常大字符串。
  • 准备“接近成功但在末尾失败”的长样本,因为这类输入更容易暴露回溯问题。
  • 在与生产一致的正则引擎中运行基准,并设置请求超时、并发和资源保护。

失败诊断与人工复核

现象 常见原因 处理方法
正确样本被拒绝 需求遗漏 Unicode、空格或大小写规则 先修订规则,再重新生成测试
反例意外通过 缺少整串锚定或字符类过宽 定位通过的最短反例并缩小范围
不同语言结果不同 正则方言或标志差异 查目标运行时文档并分别测试
长输入明显变慢 重叠分支、嵌套量词或无长度限制 简化表达式并增加输入上限

人工复核至少回答四个问题:规则是否真的适合用正则;每条业务约束是否有对应样本;失败信息是否会泄露内部格式;性能测试是否在目标引擎完成。完整 HTML、递归嵌套语言和依赖上下文的复杂语法不应硬塞进单条正则,应改用解析器或分阶段校验。

提交给 AI 的样本要去除账号、邮箱、令牌和生产日志。模型输出可能有语法或安全错误;成本还包括模型调用、测试运行和后续维护。表达式及测试代码应经过代码审查,并确认复制的第三方模式具有可接受的版权或许可条件。

结论

可靠的 AI 正则表达式测试不是“生成后试两个值”,而是先冻结规则,再用正例、反例、边界值和性能输入共同约束结果。只有目标运行时测试、ReDoS 检查和人工复核全部通过,正则才适合进入集成分支。

常见问题

AI 生成的正则表达式可以直接用于生产吗?

不可以直接使用。至少要在目标运行时执行正反例测试、限制输入长度、检查回溯路径,并由开发者确认业务规则没有被模型擅自放宽。

反例测试应该准备多少个样本?

没有固定数量,应覆盖每条规则的独立失败方式及组合边界。简单固定格式通常也应覆盖大小写、长度、分隔符、空白、换行、Unicode 相似字符和额外后缀。

什么时候不应该使用正则表达式?

当输入包含完整 HTML、递归嵌套、复杂语法状态或跨字段业务关系时,应优先使用专用解析器和业务校验代码,正则只承担局部、有限的格式检查。

想要系统学习 AI 辅助创作与开发?

文章解决具体问题;完整课程会把前置知识、操作流程、验证方法和项目资料放在一起。

查看系统课程

相关文章