我想验证我的用户输入以满足以下标准。它应该由4-7个数字组成它不应该有像1111这样的连续数字它不应该有像1234这样的连续数字
我们可以使用{4,7}来应用范围4-7,但不确定其他条件。
您能建议我们如何为java实现这一点吗?
应该由4-7个数字组成
正如你所提到的,这是微不足道的:
^[0-9]{4,7}$
不能有连续的数字,如1111
这个只是检查没有匹配:
([0-9])1+
- 匹配与先前匹配组([0-9])相同的文本,超过1次(从两个数字的重复开始)。如果您有更具体的重复标准,只需像第一种情况一样使用括号。
不应该有像1234这样的连续数字
我相信几乎所有的正则表达式引擎都不会在匹配的实际符号中执行数值比较。更多信息请点击这里。我会尝试使用其他东西而不是正则表达式,例如一个简单的for循环,从第二个元素开始,比较前一个元素是否为当前元素加上一个。O (n)
使用两组正则表达式。用一个来匹配明显的东西,比如1111|2222|3333|4444|5555|6666|7777|8888|9999|0000|1234|2345|3456|4567……力失效。然后执行简单模式:'^[0-9]{4,7}$'
您的问题是试图在一个正则表达式上完成所有操作。
不要使用正则表达式
算法比;
(尝试捕捉)
- 将输入str转换为数字和数字数组。
- 使用数字检查范围4-7。
- 使用数组检查连续的&连续数字。
- 打印决定。
str.split("");
Integer.parseInt(str);
(num>1111 && num<9999999)
if (numarr[i] + 1 != numarr[i + 1]) {//Not sequential}
if (numarr[i] != numarr[i + 1]) {//Not repeated}
public class myjava {
public static void main(String[] args) {
String str;
str = "12346a";
str = "12345";
str = "22222";
str = "12346";
try{
int num = Integer.parseInt(str);
int[] numarr= getarr(str);
if((num > 1111 && num < 9999999) && !issequential(numarr) && !isrepeated(numarr) ){
System.out.println("valid user:"+num);
}
else {
System.out.println("Invalid user:"+num);
}
}
catch(java.lang.NumberFormatException e){
System.err.println("ID is not number :"+e);
}
}
private static boolean isrepeated(int[] numarr) {
for (int i = 0; i < numarr.length - 1; i++) {
if (numarr[i] != numarr[i + 1]) {
System.out.println("Not repeated");
return false; }
}
System.out.println("repeated");
return true;
}
private static boolean issequential(int[] numarr) {
for (int i = 0; i < numarr.length - 1; i++) {
if (numarr[i] + 1 != numarr[i + 1]) {
System.out.println("Not sequential");
return false; }
}
System.out.println("sequential");
return true;
}
private static int[] getarr(String str) {
String[] strarr = str.split("");
int[] intarr = new int[str.length()];
for(int i=0;i < strarr.length;i++) intarr[i]=Integer.parseInt(strarr[i]);
return intarr;
}
}
您可以使用以下正则表达式来避免使用连续数字:-
^(?!.*([0-9])\1{2})[0-9]{6,}$
这是假设您需要至少6位数字,并且您可以使用长度为2的连续数字。我来给你解释一下:-
(?!.*([0-9])1{2})
确保在一行中没有任何字符重复超过两次。如果您不想要两个连续的数字,则从该部分删除{2}。
[0-9]{6,}
查找至少6位数字
对于连续数部分,我没有合适的解。你可以使用
"^(?!.*012)(?!.*123)(?!.*234)(?!.*345)(?!.*456)(?!.*567)(?!.*678)(?!.*789)(?!.*([0-9])\1{2})(?=.*\d)[0-9]{6}$"