先写接受条件,别只说帮我写个正则

如果字段要求整段都是产品编号,正则在字符串里找到一段编号并不代表字段合格。让Claude生成表达式前,先说清语言、大小写、允许字符以及是否可以自动去空格。

本例规则为大写PRD-后跟四位ASCII数字,共八个字符。允许PRD-0123,拒绝前后其他内容、换行、小写和全角数字。不自动trim,也不将全角字符偷偷转为半角。

一组反例比长篇说明更容易验收

只拿PRD-0123试一次,/PRD-[0-9]{4}/看起来能用。但xPRD-0123、PRD-12345也可能局部命中。把命中片段拿去当入库值,会掩盖用户输入中额外的内容。

测试清单要同时包含一个正常值,以及前缀、尾随字符、长度、大小写、字符集、末尾换行六类反例。每个预期由规则给定,不由待测正则自己决定。

局部命中与整字段合格;PRD-0123:规则接受:大写前缀与四位数字;xPRD-0123:局部命中,但字段应拒绝;末尾换行:锚点语义要结合完整文本检查;全角1234:不等于本例ASCII数字规则
本站原创示意图:局部命中与整字段合格。JavaScript固定编号练习;不是通用邮箱验证器。查看大图 ↗

加了起止锚点,还要知道语言语义

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)