正则表达式检查重复数字

时间:2012-01-05 18:38:46

标签: java regex

我有一个Java应用程序,用户必须指定PIN才能登录。创建PIN时,只有3个要求:

  • 必须是6位数:

    \\d{6}
    
  • 不得包含4个或更多序号:

    \\d*(0123|1234|2345|3456|4567|5678|6789)\\d*
    
  • 不得重复3次或以上的数字(例如000957或623334或514888): 这就是我被困的地方......

我试过了:

\\d*(\\d)\\1{3}\\d*

但我相信\1正在查看与\d*的初始匹配,而不是(\d)的第二场匹配。

<小时/> 使用的答案: 我已更新为使用:

\\d{6}
(0123|1234|2345|3456|4567|5678|6789|9876|8765|7654|6543|5432|4321|3210)
\\d*?(\\d)\\1{2,}\\d*

满足最初规定的要求加上一些我没有想到的要求!感谢所有帮助

5 个答案:

答案 0 :(得分:8)

你的正则表达式略有偏差,因为第一个\ d将匹配第一个数字。你只想在那之后再匹配2个。

\\d*(\\d)\\1{2}\\d*

应该这样做。

快速修改: 如果您想按顺序匹配2个或更多数字,只需在计数中添加逗号,而不指定最大数字:

\\d*(\\d)\\1{2,}\\d*

或者至少,这适用于Perl。让我们知道你是怎么走的。

答案 1 :(得分:4)

您想要阻止三个重复的后续数字或一般只有三个以上的数字(例如“112213”)吗?

如果是后者,Regex可能不是问题的最佳解决方案:

public static boolean validate(String pin){
    if (pin == null || pin.length() != 6)
        return false;

    int[] count = new int[10];
    for (int i = 0; i < pin.length(); i++) {
        char c = pin.charAt(i);
        if(!Character.isDigit(c))
            return false;

        if (++count[c - '0'] > 3)
            return false;
    }

    return true;
}

答案 2 :(得分:1)

我会:

  1. 检查长度== 6
  2. 检查\ d +
  3. 每个数字的频率计数:
  4. int[] f = new int[10];
    int pow10 = 1;
    int npow10 = 10;
    int nmod = 0, nmod2 = n % 10;
    while(i < 6) do
      int iDigit = (nmod2 - nmod)/pow10
      if(++f[iDigit] > 2)
        return false;
      pow10 = npow10;
      npow10 *= 10;
      nmod = nmod2;
      nmod2 = n % npow10;
      i++;
    end
    return true;
    

    int[] f = new int[10]; int pow10 = 1; int npow10 = 10; int nmod = 0, nmod2 = n % 10; while(i < 6) do int iDigit = (nmod2 - nmod)/pow10 if(++f[iDigit] > 2) return false; pow10 = npow10; npow10 *= 10; nmod = nmod2; nmod2 = n % npow10; i++; end return true;

答案 3 :(得分:1)

看起来你正在做三个独立的正则表达式匹配,大概是否定了第二个和第三个的结果。在这种情况下,这应该可以解决问题:

pinString.matches("^\\d{6}$")

!pinString.matches("^.*?(?:0123|1234|2345|3456|4567|5678|6789).*$")

!pinString.matches("^.*?(\\d)\\1{2}.*$")

使用matches()方法,您并不需要锚点(^$),但它们不会受到伤害,并且会使您的意图更加明显。此外,第一个正则表达式确保所有六个字符都是数字,因此使用.代替\\d作为其他两个字符的空格填充是安全的。

答案 4 :(得分:0)

您的示例和文字不匹配。你说它不能重复超过3次。 000是正好重复3次所以应该没问题,但是0000是4的重复,超过3,所以它不应该。要符合您的文字要求,您的正则表达式应为

.*(\d)\1{3}.*

Java字符串中应该是

".*(\\d)\\1{3}.*"

这与你所拥有的类似,所以也许你只是误解了措辞。

注意:我喜欢这个用Java测试我的正则表达式:http://www.regexplanet.com/simple/index.html