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

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

适用环境是 ChatGPT 当前网页版及目标语言的当前稳定运行时。截至 2026-08-30,应在自己的界面中确认所用模型,并核对 JavaScript、Python、Java、.NET 等运行时对锚点、Unicode、命名分组和回溯控制的差异。本文示例使用 JavaScript 语法,不代表可以原样复制到其他语言。
| 前提 | 本例选择 | 交付物 |
|---|---|---|
| 输入规则 | 三个大写字母、连字符、四位数字 | 可审阅的规则清单 |
| 目标运行时 | JavaScript | 正则及自动化样本 |
| 安全边界 | 限制输入长度,不解析嵌套语法 | ReDoS 检查记录 |
先把自然语言变成无歧义约束
正则生成失败,通常不是模型不会写符号,而是需求里出现“数字”“字符”“允许空格”等模糊词。应先确定是否整串匹配、是否允许 Unicode 字母、是否区分大小写、最大长度是多少,以及空值由正则还是业务逻辑处理。MDN 的 JavaScript 正则表达式指南可用于核对字符类、量词、分组、断言和标志的实际含义。
如果经常处理同一语言,可以把“默认输出目标运行时、逐项解释并生成反例”等偏好写入 ChatGPT 自定义指令;具体入口可能随界面和套餐变化,应以当前页面为准。OpenAI 的自定义指令说明用于了解这项功能,但不要在其中保存项目密钥、内部样本或个人资料。
生成正则并要求 AI 自我对抗
- 冻结规则:写成编号清单,明确字符范围、位置、长度、空值和换行处理。不要只给三个正确示例让模型猜规律。
- 指定方言:明确要求 JavaScript 正则字面量,并让模型标注是否使用标志、前后锚点、捕获组或前瞻。
- 限制输出:要求先复述规则,再输出一个首选表达式、一个更易读的替代方案及差异;禁止自行扩展需求。
- 建立反例:让 AI 按错误类型生成样本,包括长度不足、长度超出、大小写错误、分隔符错误、前后空格、换行和相似 Unicode 字符。
- 提出攻击问题:要求寻找嵌套量词、重叠分支、无限输入和失败路径上的大量回溯,不接受一句“没有风险”作为结论。
目标运行时: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、递归嵌套、复杂语法状态或跨字段业务关系时,应优先使用专用解析器和业务校验代码,正则只承担局部、有限的格式检查。