让 AI 写正则表达式:先给正反样本,再讨论那一串符号
“帮我写一个匹配编号的正则”信息太少。编号是否区分大小写,允许全角数字吗,前后空格要拒绝还是忽略,匹配整段还是从文字里提取?AI 即使给出能运行的表达式,也可能替你默默决定这些规则。先写样本,再写表达式,能把分歧提前暴露出来。
AI生成概念配图
把输入规则写成明确句子
虚构的“北岸图书角”采用一种内部编号:固定大写前缀 BK,接连字符、两个大写英文字母、连字符和三位 ASCII 数字。要求整个输入完全符合,前后不允许空白。这里只检查格式,不检查编号是否已登记,也不赋予编号任何真实业务含义。
正例是 BK-AB-001 与 BK-ZZ-999。反例包括小写前缀、只有一个字母、四位数字、全角数字,以及正确编号前多一个字符。还要加入空字符串和尾部换行,因为界面里不容易看见的字符同样可能改变结果。每个反例应对应一条规则,而非随机挑几串乱码。
告诉 AI 具体引擎和调用方式
可复用模板:我使用 Python 的 re 模块,需要验证整个字符串。规则、正例、反例与预期结果如下。请先指出规则歧义,再给出最简单的候选表达式,逐段解释其含义,并提供可运行检查。不要自动去掉空白、转换大小写或更改输入;如果建议预处理,单独说明它改变了哪条规则。
Python 官方文档区分 search、match 与 fullmatch:寻找局部匹配、从开头匹配和要求整个字符串匹配是不同操作。本例采用 fullmatch,因此不需要再靠一对锚点表达完整输入校验。数字范围明确写成零到九,也避免把“数字”一词默认为更宽的 Unicode 数字集合。
先运行这一组最小检查
import re
pattern = re.compile(r"BK-[A-Z]{2}-[0-9]{3}")
cases = [
("BK-AB-001", True), ("BK-ZZ-999", True),
("bk-AB-001", False), ("BK-A-001", False),
("BK-AB-0001", False), ("BK-AB-123", False),
("XBK-AB-001", False), ("BK-AB-001\n", False),
("", False),
]
for value, expected in cases:
actual = pattern.fullmatch(value) is not None
assert actual == expected, (repr(value), actual, expected)
print("all cases passed")上面的候选由固定前缀、两个大写字母和三位数字组成。检查成功会输出 all cases passed;它仅说明这些样本符合预期。若报出某条断言失败,先核实预期是否忠实于业务规则,再判断表达式或调用方式哪里出了问题,不要为了让检查变绿直接改答案。
保留失败样本,避免修好一个又放过另一个
假如后来提出“允许小写编号”,这是规则变化,应补上正例并明确是否允许混合大小写。假如只是某个输入框误带空格,则需要决定修输入流程还是允许修剪。两者都不能由 AI 自行解释成“用户体验优化”,否则不同入口可能对同一编号采用不同规则。
每次修改后重新运行已有样本,再增加新暴露的边界。AI 工具没有执行环境时,应在自己的 Python 环境中运行,不能把它描述的预期当成运行结果。正式接收外部输入时,还应限制输入长度,并针对实际表达式检查性能;几个短样本不能证明任意长文本都能快速处理。本文表达式刻意保持简单,不需要复杂的多层可选分支。
别让格式校验承担所有工作
格式正确不等于编号存在、有权限使用或业务状态有效。这些判断应交给相应的数据查询与业务校验。把候选表达式、样本、运行环境和规则版本一起保存,后续迁移到其他语言时重新执行检查。AI 最有用的角色,是协助补全你没想到的边界,而不是让一串难读的符号获得免检资格。


