提示词典TISHICIDIAN
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。

不同模型、不同时间的回答会有差异;想对比几个模型,可以把这段提示词拿到提示词实验室并排跑一遍。

注意

参见