如何编写正则校验满足指定数字重复规则的合法10位数字?
10位特殊规则数字校验方案
正则实现方案
你之前尝试的写法都只匹配连续重复的数字,没有覆盖非连续重复场景,也没有排除其他非法重复情况,符合要求的secondPattern正则如下:
^(?!.*(\d).*\1.*\1.*\1)(?!.*(\d).*\2.*(\d).*\3)(?=.*(\d).*\4)
各部分逻辑说明:
(?!.*(\d).*\1.*\1.*\1):负向预查,禁止任意数字出现4次及以上(?!.*(\d).*\2.*(\d).*\3):负向预查,禁止存在2个及以上的数字各出现至少2次(?=.*(\d).*\4):正向预查,确保存在至少1个数字出现至少2次
使用时和你已有的基础规则正则/^[1-9]\d{9}$/共同校验,两个正则都匹配即为符合要求的数字。
更推荐的非正则实现方案
复杂正则可读性差、调试维护成本高,更推荐用频次统计的方式实现,以下是JavaScript示例:
function validateNumber(input) { // 先校验基础规则:10位数字、首位非0 if (!/^[1-9]\d{9}$/.test(input)) return false; // 统计0-9每个数字的出现次数 const freq = new Array(10).fill(0); for (const char of input) { freq[Number(char)]++; } // 统计频次分布 let repeat2or3Count = 0; let zeroCount = 0; let invalidFreq = false; for (const count of freq) { if (count === 0) zeroCount++; else if (count === 2 || count === 3) repeat2or3Count++; else if (count !== 1) invalidFreq = true; } // 匹配规则要求 return !invalidFreq && repeat2or3Count === 1 && (zeroCount === 1 || zeroCount === 2); }
该方案逻辑直观,调试方便,性能和正则方案基本持平,适合大部分业务场景。
内容的提问来源于stack exchange,提问作者Ravichandra
相关产品推荐
相关产品推荐

