先写接受条件,别只说帮我写个正则
如果字段要求整段都是产品编号,正则在字符串里找到一段编号并不代表字段合格。让Claude生成表达式前,先说清语言、大小写、允许字符以及是否可以自动去空格。
本例规则为大写PRD-后跟四位ASCII数字,共八个字符。允许PRD-0123,拒绝前后其他内容、换行、小写和全角数字。不自动trim,也不将全角字符偷偷转为半角。
一组反例比长篇说明更容易验收
只拿PRD-0123试一次,/PRD-[0-9]{4}/看起来能用。但xPRD-0123、PRD-12345也可能局部命中。把命中片段拿去当入库值,会掩盖用户输入中额外的内容。
测试清单要同时包含一个正常值,以及前缀、尾随字符、长度、大小写、字符集、末尾换行六类反例。每个预期由规则给定,不由待测正则自己决定。

加了起止锚点,还要知道语言语义
JavaScript启用m多行模式时,$也可以匹配行末,包括换行符之前的位置。本例没有启用m,起止锚点已经会拒绝PRD-0123后多一个换行的输入;match[0]与原始字符串的比较是额外写明“整字段必须一致”的验收,不是修补无m锚点接受换行的问题。
函数没有使用m、g或i标记。m会改变锚点的行边界含义,g配合有状态方法还会带来lastIndex问题;若Claude给出的代码使用这些标记,应要求解释原因并用同一组反例复测。
运行完整匹配函数
文末代码保存为regex-whole-id.mjs,用Node.js 24 LTS执行:node regex-whole-id.mjs --demo。输出同时给出partial和whole:正常值均为true,带x前缀的局部匹配为true而完整检查为false,末尾换行也必须为false。
validProductId先拒绝非字符串,避免null、数字被隐式转换成你没有定义过的输入。比较时使用原字符串,不先删空格;否则你测的是清洗后的另一份数据。
怎样把失败样例交回Claude
提供规则、完整函数、运行版本,以及“输入—期望—实际”三列。比如说明末尾换行实际被接受,而规则要求拒绝,请只修改验证函数并保留所有回归样例。不要只说正则不好用。
如果业务允许空格,应显式增加清洗阶段,并分别保存原始值与规范化值。邮箱、URL、Unicode姓名等复杂格式另有规则,不能从这个固定编号演示推导出通用正则。
本篇验证了什么
本地实际检查了正常编号及八类非法输入,覆盖末尾LF、CRLF和非字符串。没有调用模型或测量Claude正则生成准确率,也没有做长输入性能或拒绝服务压力测试。
复杂表达式还应限制输入长度并在受控环境评估耗时。先确认匹配语义,再谈更短的写法,能避免把难读表达式当成质量保证。
参考资料与核验范围
资料核对日期:2026年10月20日。以下为官方原始资料;产品入口和可用范围仍以当前账户为准。
1. [官方资料1](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests)
2. [官方资料2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Assertions)