跳到主内容

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 越来越能写的今天,这层基线恰恰是最稀缺、最值钱的工程资产。

避坑总结 ​

  1. 盯住模型四类高频错误:虚构语法、贪婪误用、Unicode 语义想当然、漏写锚点。校验器的静态闸与动态闸要针对这四类专门设卡。
  2. 校验与生成彻底解耦。校验器是纯规则代码,不要让另一个模型当裁判——共同盲区会制造虚假安全感。
  3. 模型自报用例不可全信。入库测试必须由人补充空串、超长串、Unicode 三类边界,AI 天然爱给「顺手的例子」。
  4. 模糊测试是免费的 ReDoS 保险。两百个随机样本加耗时护栏,成本毫秒级,收益是回溯灾难的早期拦截。
  5. 人工评审保留终审权。语法正确性已经交给机器,人的精力集中在语义边界与业务含义——这才是大模型时代人的核心价值。

写在最后:AI 辅助写正则的正确分工里,大模型是高产出的初稿工,工程流水线是铁面评委,人是语义的最终责任人。把这三道闸立起来,「效率提升一个量级」与「质量不降级」才可能同时成立。

免责声明

本工具与文章内容仅用于学习测试场景,优化建议仅供参考,请勿直接用于生产环境,由此产生的风险自行承担。