如何用正则表达式匹配符合特定规则的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
相关产品推荐
相关产品推荐

