You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式匹配符合特定规则的11位数字字符串?

符合特定规则的11位数字字符串正则表达式解决方案

需求规则

要匹配的字符串必须是纯数字,且满足:

  • 总长度为11位
  • 第一位固定为0,第二位固定为1
  • 第三位只能是0、1、2、5中的一个
  • 额外约束:
    • 如果第三位是1,则第十、第十一位数字必须相同
    • 如果第三位是2,则第八、第九位数字必须相同

测试用例及预期结果

01012345678          -----> allowed.
0101234a5678         -----> not allowed., letter exists.
01112345688          -----> allowed, 10th, 11st are the same
01112345677          -----> allowed, 10th, 11st are the same
01112345666          -----> allowed, 10th, 11st are the same
01112345689          -----> not allowed..10th, 11st different
01112345-678         -----> not allowed..hyphen exists.
01298765532          -----> allowed..8th, 9th are the same.
01298765732          -----> not allowed, 8th, 9th different.
01298765mm432        -----> not allowed, letter exists.
01500011122          -----> allowed..
020132156456136      -----> not allowed..more than 11 digit.
01530126453333       -----> not allowed..more than 11 digit.
00123456789          -----> not allowed.. second digit not 1.

原有正则的问题

之前尝试的^01[0125][0-9]{8}$只覆盖了基础规则,没处理第三位为1或2时的额外约束,导致像01112345689这类不符合特殊规则的字符串也会被错误匹配。

正确的正则表达式

^01(?:0\d{8}|1\d{6}(\d)\1|2\d{4}(\d)\2\d{2}|5\d{8})$

正则拆解说明

  • ^01:锁定字符串开头必须是0和1,满足前两位的硬性要求
  • (?:...):非捕获分组,用来区分第三位的四种情况,避免生成多余的捕获组
    • 0\d{8}:第三位是0时,后面跟任意8个数字(总长度11,前3位+8位刚好11位)
    • 1\d{6}(\d)\1:第三位是1时,先匹配6个任意数字,然后捕获第十位的数字(\d),再用\1强制第十一位和捕获的数字相同
    • 2\d{4}(\d)\2\d{2}:第三位是2时,先匹配4个任意数字,捕获第八位的数字(\d),用\2强制第九位和捕获的数字相同,最后再匹配2个任意数字
    • 5\d{8}:第三位是5时,后面跟任意8个数字,无额外约束

测试验证

用这个正则测试所有用例:

  • 符合规则的字符串(如01012345678、01112345688、01298765532、01500011122)都会被匹配
  • 含非数字、长度不符、第二位不是1、不满足特殊约束的字符串(如0101234a5678、01112345689、01298765732等)都不会被匹配,完全符合预期

内容的提问来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:35:19