我有一个Java应用程序,用户必须指定PIN才能登录。创建PIN时,只有3个要求:
必须是6位数:
\\d{6}
不得包含4个或更多序号:
\\d*(0123|1234|2345|3456|4567|5678|6789)\\d*
我试过了:
\\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*
满足最初规定的要求加上一些我没有想到的要求!感谢所有帮助
答案 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)
我会:
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