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

如何编写正则校验满足指定数字重复规则的合法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:06:06