正则表达式难写、更难读,是很多开发者的心病。把「匹配中国大陆手机号」「提取文本里所有 URL 」这类需求直接说给 AI 听,几秒钟就能拿到一段能跑的模式。但 AI 给的正则常常「看起来对、跑起来漏」,本文讲清怎么让 AI 生成既正确又可维护的正则,以及上线前必须做的三道验证。
为什么正则适合交给 AI
正则的痛点不在语法多难,而在于它把逻辑压缩成一串难以阅读的符号。人写正则容易漏边界、错转义,而 AI 见过海量模式,能从自然语言描述里直接推断出意图。更重要的是,AI 可以同时给你多语言版本和测试用例,省去你查手册的时间。但它不是神仙——AI 默认追求「能匹配你举的例子」,不会主动覆盖你没说的边界,这正是需要人把关的地方。
把需求说清楚:提示词的写法
模糊的需求会得到模糊的正则。与其说「帮我写个邮箱正则」,不如给 AI 明确约束:要匹配什么、不要匹配什么、运行在哪个引擎。一个好用的提问结构是「场景 + 样例 + 引擎 + 边界」。例如:「用 Python re 写一个匹配中国大陆手机号的正则,样例 13812345678 应匹配、 12345 和 1381234567(10 位)不应匹配。」越具体的反例,越能逼出准确模式。关于怎么把需求描述得让 AI 一次到位,可以参考 AI 编程多模型分工 里对提示结构的拆解。
让 AI 自带测试用例
不要只索要一行正则,要它同时产出测试。让 AI 写一段覆盖正常、边界和异常输入的脚本,并在本地实跑。比如让模型生成 10 个应匹配和 5 个不应匹配的字符串,用断言验证。这一步能把「肉眼看着像」变成「机器验过对」。把测试纳入仓库,下次改动正则时一键回归,避免改一处漏一片。
上线前的三道验证
- 正确性:用你的真实数据跑一遍,尤其是那些边界样本,确认不漏不误。
- 性能:用长文本或恶意输入压测,确认没有灾难性回溯(ReDoS),否则一个长字符串就能打挂服务。
- 迁移性:确认目标语言/库支持你用到的语法(如环视、命名分组在部分引擎里不支持)。
性能和正确性是两件事,正确不代表快。关于在大型代码库里安全地验证 AI 产物,可以结合 AI 编程的代码检索 的思路,把正则放进受控环境再验证。
可读性:把天书变回人话
AI 产出的正则往往是一行超长表达式。上线前让它加注释、拆成具名分组,或者用 x 模式(忽略空白、允许注释)重写。团队里下一个维护者看到 (?P<area>\d{3}) 加一行注释,远比面对 \d{3}\d{4}\d{4} 安心。可读性不是洁癖,而是降低未来改错的概率。
- 用例子说话:给 AI 3 到 5 个应该匹配的样例和 2 到 3 个不应该匹配的样例,越具体越好。
- 限定引擎:明确是 JS 、 Python re 、 Go 还是 PCRE,不同引擎语法有差异。
- 要求解释:让 AI 逐段说明每个分组和量词的含义,而不是只丢代码。
- 生成测试:让 AI 写出覆盖边界的测试脚本,并本地实跑确认全绿。
- 加注释化简:把复杂模式拆成具名分组并注释,必要时让 AI 化简提升可维护性。
常见场景与坑
- 贪婪匹配:默认
.*会吞掉过多内容,记得用非贪婪.*?或限定字符集。 - 转义遗漏:点号、斜杠、括号在正则里有特殊含义,AI 偶尔会漏转义,测试能抓出来。
- Unicode 边界:中文、 emoji 的边界处理和 ASCII 不同,涉及多语言文本时要特别说明。
把正则交给 AI 是效率革命,但把它当作「生成后即可信」是事故开端。建立「样例约束 + 自带测试 + 三道验证 + 注释化简」的闭环,正则就从玄学变成可维护的工程资产。这与 AI 代码评审清单 倡导的「先跑一遍再人工终审」是一致的。
常见问题
AI 生成的正则能直接上生产吗?
不同语言的正则语法差异大吗?
怎么防止正则导致服务卡死?
AI 给的正则读不懂怎么办?






评论 (0)