外观
AI 辅助生成正则实战:让大模型写正则、人工做校验的协作流水线
正则大概是 AI 时代被「一把梭」得最狠的技术之一:把需求丢给大模型,复制输出进代码,全程不到一分钟。我们团队最初也是这么干的,然后接连翻了三次车。这篇实战文章的立场很明确:AI 写正则确实值得用,但必须有一套生成、校验、回归的协作流水线托底——AI 出初稿,机器做证明,人负最终责任。
问题背景:手写正则的三难与「AI 一把梭」的三险
先说手写正则的三难:语法冷僻,环视、命名分组这些特性用一次查一次;调参靠试错,线上验证一行行改;回归无保障,改一处坏一处没报警。所以当大模型能秒出正则时,团队自然选择拥抱。
但「AI 一把梭」有三险,我们三次翻车一次不落。第一险,幻觉语法:模型给 JavaScript 写了占有量词 *+,直接语法报错——它把 PCRE 的特性张冠李戴到了 JS 头上。第二险,贪婪误用:一条提取正则用了 .*,把不该吞的内容吞进去,而我们的验证只跑了正例,完全没发现。第三险,埋雷回溯:一条校验正则带嵌套量词,没有超时保护,实际上是潜在的回溯灾难隐患。
三次翻车的共同点一目了然:我们把 AI 生成物当成了「成品」,而它的真实身份是「未经测试的初稿」。接受这个定位,问题就从「敢不敢用 AI」变成「用什么流程验证 AI」——这正是下文流水线要解决的。
流水线设计:生成、校验、回归的三道闸
整条流水线分六个环节,大模型只负责第二环,其余全部由确定性机制把关:
| 环节 | 执行者 | 职责 | 失败处置 |
|---|---|---|---|
| 需求结构化 | 人 | 写清引擎、禁用特性、正反例 | 驳回补需求 |
| 候选生成 | 大模型 | 输出正则、逐段解释、自测用例 | 低温度多候选择优 |
| 静态校验 | 规则代码 | 语法编译、禁用特性扫描 | 直接拒绝 |
| 动态校验 | 规则代码 | 正例全过、反例全拒 | 直接拒绝 |
| 模糊测试 | 规则代码 | 随机样本加耗时护栏 | 判定回溯风险拒绝 |
| 人工评审 | 人 | 语义边界终审 | 退回重生成 |
设计上有两条铁律。第一,校验器与生成器彻底解耦:校验必须是纯规则代码,绝不引入「让另一个模型当裁判」——不同模型有共同盲区,互相印证只会制造虚假安全感。第二,模型自报的正反例只作参考,入库的测试用例必须经人工补充边界值后固化。AI 在这条流水线里是高产出的初稿工,不是质检员。
实操第一步:把需求写成结构化提示词
生成质量的上限由提示词决定。实践中稳定产出高质量结果的模板长这样:
text
你是资深正则工程师。请为以下需求生成正则,并严格遵守全部约束:
【目标引擎】Python 3.12 re 模块;禁止出现其他语言独有语法
【禁止特性】后行断言、反向引用、占有量词、递归(未来需兼容 RE2 迁移)
【业务需求】校验工单号:GW- 开头,年份四位数字,序号 3~6 位数字,要求全串匹配
【正例】GW-2026-00123、GW-2025-9
【反例】gw-2026-00123、GW-26-00123、GW-2026-001234
【性能要求】禁止嵌套量词;单次匹配耗时不超过 1 毫秒
【输出格式】仅输出 JSON:
{"pattern": "...", "explain": "逐段中文解释", "positive_cases": [...], "negative_cases": [...]}模板里每个字段都是压幻觉的机关。目标引擎声明直接杜绝张冠李戴——第一次翻车(给 JS 写占有量词)的根因就是没声明引擎;禁止特性清单把未来迁移风险前置到生成阶段;正反例让语义理解偏差无处藏身;要求逐段解释是强制模型显式推理,实测能把低级错误率压下去一大截;固定 JSON 格式则让下游校验器可以机器消费,不用人肉从对话里抠正则。温度调低、一次生成三个候选再择优,是另一条免费的收益。
实操第二步:自动校验器——机器当第一轮评委
校验器是整条流水线的价值核心。以下 Python 实现可直接落库使用,四道闸依次把关:
python
# ai_regex_validator.py:AI 生成正则的第一轮机器评委
import random
import re
import string
import time
# 禁用特性清单:按目标引擎能力维护,出现即拒绝
FORBIDDEN = ["(?<", "(?P=", "(?>", "++", "*+", "?+", "\\1", "\\2"]
def validate(spec: dict, timeout_ms: int = 50) -> dict:
report = {"syntax": False, "static": False,
"dynamic": False, "redos_safe": False}
pattern = spec.get("pattern", "")
# 第一道闸:语法编译,编不过直接出局(拦住幻觉语法)
try:
compiled = re.compile(pattern)
except re.error as e:
return {"error": f"语法错误: {e}"}
report["syntax"] = True
# 第二道闸:静态扫描禁用特性,守住方言兼容与结构红线
if any(f in pattern for f in FORBIDDEN):
return {"error": "包含禁用特性,需人工评估引擎兼容性"}
report["static"] = True
# 第三道闸:动态校验,正例必须全过、反例必须全拒
ok_pos = all(compiled.fullmatch(c) for c in spec.get("positive_cases", []))
ok_neg = not any(compiled.fullmatch(c) for c in spec.get("negative_cases", []))
if not (ok_pos and ok_neg):
return {"error": "自测用例未通过:正例漏配或反例误配"}
report["dynamic"] = True
# 第四道闸:模糊测试加耗时护栏,探测回溯灾难
rng = random.Random(2026)
pool = string.ascii_letters + string.digits + " -_"
for _ in range(200):
evil = "".join(rng.choice(pool) for _ in range(120))
t0 = time.perf_counter()
compiled.search(evil)
if (time.perf_counter() - t0) * 1000 > timeout_ms:
return {"error": "疑似回溯灾难:模糊样本匹配超时"}
report["redos_safe"] = True
return report四道闸各司其职:语法闸挡幻觉语法,静态闸守方言红线,动态闸验语义对错,模糊闸用两百个随机样本近似压测回溯风险。全部跑完毫秒级成本,却把我们三次翻车里的三次全部拦在了线外——这就是「用确定性机制验证概率性输出」的直接回报。
实操第三步:回归测试集与 CI 卡点
通过校验的正则进入版本化用例库,永久保留。YAML 一条正则一份 spec:
yaml
# regex_cases.yaml:入库正则用例库,新增条目必须走完四道闸
- name: ticket_no
spec:
pattern: '^GW-\d{4}-\d{3,6}$'
positive_cases: ["GW-2026-00123", "GW-2025-9"]
negative_cases: ["gw-2026-00123", "GW-26-00123", "GW-2026-001234"]CI 卡点用 pytest 参数化一气呵成,失败即拒绝合入:
python
# test_ai_regex.py:回归护城河,CI 必跑
import pytest
import yaml
from ai_regex_validator import validate
with open("regex_cases.yaml", encoding="utf-8") as f:
CASES = yaml.safe_load(f)
@pytest.mark.parametrize("case", CASES, ids=lambda c: c["name"])
def test_regex_case(case):
report = validate(case["spec"])
assert report.get("error") is None, f"{case['name']} 校验失败: {report}"
assert all(report[k] for k in ("syntax", "static", "dynamic", "redos_safe"))落地节奏建议:新正则一律走「生成、校验、评审、入库」全流程;存量正则哪怕只改一个字符,也要重跑全量用例。坚持半年,团队会自然沉淀出一层可执行的正则行为基线——在 AI 越来越能写的今天,这层基线恰恰是最稀缺、最值钱的工程资产。
避坑总结
- 盯住模型四类高频错误:虚构语法、贪婪误用、Unicode 语义想当然、漏写锚点。校验器的静态闸与动态闸要针对这四类专门设卡。
- 校验与生成彻底解耦。校验器是纯规则代码,不要让另一个模型当裁判——共同盲区会制造虚假安全感。
- 模型自报用例不可全信。入库测试必须由人补充空串、超长串、Unicode 三类边界,AI 天然爱给「顺手的例子」。
- 模糊测试是免费的 ReDoS 保险。两百个随机样本加耗时护栏,成本毫秒级,收益是回溯灾难的早期拦截。
- 人工评审保留终审权。语法正确性已经交给机器,人的精力集中在语义边界与业务含义——这才是大模型时代人的核心价值。
写在最后:AI 辅助写正则的正确分工里,大模型是高产出的初稿工,工程流水线是铁面评委,人是语义的最终责任人。把这三道闸立起来,「效率提升一个量级」与「质量不降级」才可能同时成立。
免责声明
本工具与文章内容仅用于学习测试场景,优化建议仅供参考,请勿直接用于生产环境,由此产生的风险自行承担。