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

求验证密码:禁止同一字符(非连续)出现超3次的正则表达式

解决密码字符全局重复次数验证问题

你提到的问题很典型——正则表达式([0-9])\1{2,}只能检测连续重复的字符,但你需要的是验证任意位置的同一字符出现次数不超过3次(3次是允许的,超过则拒绝)。

方案一:用代码逻辑统计(推荐)

正则其实并不擅长做全局字符计数,这种场景下直接用代码遍历统计会更直观、易维护。以JavaScript为例,实现如下:

function isValidPassword(password) {
  const countMap = {};
  for (const char of password) {
    // 如果只需要限制数字,保留下面的判断;如果要限制所有字符,去掉即可
    if (!/[0-9]/.test(char)) continue;
    
    countMap[char] = (countMap[char] || 0) + 1;
    // 一旦某个字符出现次数超过3次,直接返回不合法
    if (countMap[char] > 3) {
      return false;
    }
  }
  return true;
}

逻辑说明:

  • 遍历密码的每个字符,用对象countMap记录每个数字的出现次数
  • 每次计数后检查是否超过3次,超过则立即返回false,无需遍历完整个字符串
  • 如果需要扩展到包含字母、符号等,去掉if (!/[0-9]/.test(char)) continue;这一行即可

方案二:用正则表达式(适合必须用正则的场景)

如果你的场景要求必须用正则,可以通过负向预查来实现全局次数限制。针对数字的正则如下:

^(?![0-9]*([0-9])(?:[0-9]*\1){3})[0-9]+$

正则拆解:

  • ^ 和 $:锁定整个密码字符串,避免只匹配部分内容
  • (?!...):负向预查,表示“后面的内容不能匹配这个模式”
  • [0-9]*([0-9]):匹配任意数量数字后,捕获一个数字(标记为\1)
  • (?:[0-9]*\1){3}:表示捕获的数字\1再出现3次(加上第一次捕获的,总共4次)
  • 整个预查的作用是:确保不存在任何数字出现4次及以上的情况,同时要求整个密码都是数字

如果需要支持字母等其他字符,把正则里的[0-9]替换成你需要的字符集,比如[a-zA-Z0-9]。

测试示例验证:

  • 合法案例:121212(1和2各出现3次)→ 两种方案都返回true
  • 非法案例:121121(1出现4次)→ 两种方案都返回false
  • 合法案例:111222(1和2各出现3次)→ 两种方案都返回true
  • 非法案例:111122(1出现4次)→ 两种方案都返回false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:14:58