No.008 · 编程
写正则,并给出反例
要正则的同时,要它自己列出会误匹配的情况。
提示词
帮我写一个正则,匹配:【描述,比如“中国大陆手机号”】
运行环境:【JavaScript / Python / ...】
请同时给出:
- 5 个应该匹配的例子
- 5 个不应该匹配、但容易被误匹配的例子
- 正则每一部分的解释
示例:填好之后,模型这样回答
填好后的提示词(示例内容为虚构)
帮我写一个正则,匹配:虚构的星际基地编号(格式如 ZX-3-0917,两位大写字母开头,接一位数字,再接四位数字) 运行环境:JavaScript 请同时给出: - 5 个应该匹配的例子 - 5 个不应该匹配、但容易被误匹配的例子 - 正则每一部分的解释
模型回答 · claude-sonnet-5-5 · 2026-10-24 实跑,未修改
正则表达式
const baseCodeRegex = /^[A-Z]{2}-\d-\d{4}$/;如果要在一段长文本中查找,去掉首尾锚点,改用单词边界并加 g:
const baseCodeInText = /\b[A-Z]{2}-\d-\d{4}\b/g;5 个应该匹配的例子
| 例子 | 说明 |
|---|---|
ZX-3-0917 | 题目原例 |
AB-0-0000 | 数字可以全是 0 |
QR-9-9999 | 边界值 |
KT-7-1234 | 普通情况 |
MM-5-0001 | 字母可以重复,四位数字允许前导 0 |
5 个不应该匹配、但容易被误匹配的例子
| 例子 | 为什么不匹配 | 容易误匹配的原因 |
|---|---|---|
zx-3-0917 | 小写字母 | 忽略大小写时会被放过(不要加 i 标志) |
ZXY-3-0917 | 字母是 3 位 | 只写 [A-Z]+ 或不加锚点时,会匹配到末尾的 XY-3-0917 |
ZX-33-0917 | 中间数字是 2 位 | 写成 \d+ 时会被放过 |
ZX-3-09177 | 末尾是 5 位数字 | 没加 $ 或 \b 时,前 4 位会匹配成功 |
ZX-3-0917 | 字母是全角字符 | 看起来像 ZX,但不在 [A-Z] 范围内 |
其他同类的错误输入:ZX-3-917(少一位)、ZX30917(缺连字符)、 ZX-3-0917 (首尾有空格,^...$ 下会失败,需要先 trim())。
各部分解释
| 片段 | 含义 |
|---|---|
^ | 从字符串开头匹配,防止前面混入多余字符 |
[A-Z]{2} | 恰好两个大写英文字母(ASCII 范围) |
- | 字面量连字符,分隔字母与数字 |
\d | 恰好一位数字(JS 中不带 u 标志时只匹配 0-9) |
- | 第二个连字符 |
\d{4} | 恰好四位数字,允许前导 0 |
$ | 到字符串结尾为止,防止后面混入多余字符 |
快速验证
const re = /^[A-Z]{2}-\d-\d{4}$/;
["ZX-3-0917", "AB-0-0000", "QR-9-9999", "KT-7-1234", "MM-5-0001"]
.forEach(s => console.log(s, re.test(s))); // 全部 true
["zx-3-0917", "ZXY-3-0917", "ZX-33-0917", "ZX-3-09177", "ZX-3-0917"]
.forEach(s => console.log(s, re.test(s))); // 全部 false注意
- 我按示例
ZX-3-0917的格式加入了两个连字符。如果你的编号实际上没有连字符(如ZX30917),正则应改为/^[A-Z]{2}\d\d{4}$/,即/^[A-Z]{2}\d{5}$/。 - 在全文搜索版本中,
ZX-3-0917-5这样的字符串仍会匹配出ZX-3-0917,因为-也算单词边界。如果需要排除,可改用前后断言:/(?<![\w-])[A-Z]{2}-\d-\d{4}(?![\w-])/g。
不同模型、不同时间的回答会有差异;想对比几个模型,可以把这段提示词拿到提示词实验室并排跑一遍。
注意
- 拿它给的反例自己跑一遍,比相信解释更可靠。