判断字符串中的数字是否相同,连续

 
最近几天在写pin code和指纹登录功能,一直没有时间总结技术,今天终于有点时间了。
我们的pin code的规则如下图所示:
 
 
 

先说一下我对这个问题的解决思路:

  1. 我们先进行判重,怎么进行判重呢,首先我们需要把字符串中的数字切割成单独的数字,放入到数组中,这样你是不是有点思路了呢?我们可以利用for循环,用数组中的第一个元素和其他元素一一进行比较,如果有不相等的说明这个字符串的数字是不相同的。

    2. 再判断数字是否连续的,这个需要我们分成两部分来判断:递增连续、递减连续。

          2.1 判断递增连续,我们可以利用for循环进行操作,如果i>0在里面对arr[i]和arr[i-1] + 1 进行判断是否相等,如果有一次不相等,就说明这个字符串不是连续递增的。判断递减也可以依同样的方式进行解决。

         2.2 判断递减连续,利用for循环进行操作,如果i>0在里面对arr[i]和arr[i-1] - 1 进行判断是否相等,如果有一次不相等,就说明这个字符串不是连续递减的。

 
第一种方法,使用一个临时int变量j,来判断比较了多少次,如果比较了arr.count - 1次,就能说明全部比较完成了。
+(BOOL)checkPincode:(NSString*)pincode
{
    BOOL isTure = NO;//不符合规则,pincode是相同的或连续的
    NSString *pincodeRegex = @"^(?=.*\\d+)(?!.*?([\\d])\\1{4})[\\d]{5}$";
    NSPredicate *pincodePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pincodeRegex];
   
    NSMutableArray * arr = [NSMutableArray arrayWithCapacity:0];
    if ([pincodePredicate evaluateWithObject:pincode]) {
       
        // 遍历字符串,按字符来遍历。每个字符将通过block参数中的substring传出
        [pincode enumerateSubstringsInRange:NSMakeRange(0, pincode.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
            //将遍历出来的字符串添加到数组中
            [arr addObject:substring];
           
        }];
       
        BOOL isInscend = [CommonService judgeInscend:arr];
        BOOL isDescend = [CommonService judgeDescend:arr];
        if ( !isInscend && !isDescend) {
            isTure = YES;
        }
       
    }
   
    return isTure;
}

+ (BOOL)judgeInscend:(NSArray *)arr{
    //递增12345
    int j = 0;
    for (int i = 0; i<arr.count; i++) {
        if (i>0) {
            int num = [arr[i] intValue];
            int num_ = [arr[i-1] intValue] +1;
            if (num == num_) {
                j++;
            }
        }
    }
   
    if (j == arr.count - 1) {
        return YES;
    }

    return NO;
}

+ (BOOL)judgeDescend:(NSArray *)arr{
    //递减54321
    int j=0;//计数归零,用于递减判断
    for (int i = 0; i<arr.count; i++) {
        if (i>0) {
            int num = [arr[i] intValue];
            int num_ = [arr[i-1] intValue]-1;
            if (num == num_) {
                j++;
            }
        }
    }
    if (j == arr.count - 1) {
        return YES;
    }
    return NO;
}
 
//判断是否相等

+ (BOOL)judgeEqual:(NSArray *)arr{

    int j=0;

    int firstNum = [arr[0] intValue];

    for (int i = 0; i<arr.count; i++) {

        if (firstNum == [arr[i] intValue]) {

            j++;

        }

    }

    if (j == arr.count - 1) {

        return YES;

    }

    return NO;

}

第二种方法,用BOOL进行判断,只要有一个不相等的,就break结束循环,这个是最方便和也是最容易理解的
//判断是否相等

+ (BOOL)judgeEqual:(NSArray *)arr{

    BOOL flag = YES;

    int firstNum = [arr[0] intValue];

    for (int i = 0; i<arr.count; i++) {

        if (firstNum != [arr[i] intValue]) {

            flag = NO;

            break;

        }

    }

    return flag;

}

+ (BOOL)judgeInscend:(NSArray *)arr{

    //递增12345

    BOOL flag = YES;

    for (int i = 0; i<arr.count; i++) {

        if (i>0) {

            int num = [arr[i] intValue];

            int num_ = [arr[i-1] intValue] +1;

            if (num != num_) {

                flag = NO;

                break;

            }

        }

    }

    

    return flag;

}

+ (BOOL)judgeDescend:(NSArray *)arr{

    //递减54321

    BOOL flag = YES;

    for (int i = 0; i<arr.count; i++) {

        if (i>0) {

            int num = [arr[i] intValue];

            int num_ = [arr[i-1] intValue]-1;

            if (num != num_) {

                flag = NO;

                break;

            }

        }

    }

    return flag;

 
}
 
 
///////////////////

2
3
4
5
6
7
8
9
10
string psw = "111111"//密码
string srt = "0123456789_9876543210_abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ_zyxwvutsrqponmlkjihgfedcba_ZYXWVUTSRQPONMLKJIHGFEDCBA";
 if (psw.Length != 6 || psw.Distinct().Count() == 1 || (!psw.Contains("_") && srt.Contains(psw)))
{
    //不通过
}
else
 {
    //通过
}

 

判断连续

C# code
 
?
1
2
3
4
5
6
7
8
if(str.length<2){return false;}
else
{
for(int i=1;i<str.length;i++)
{
 if(abs(str[i]-str[i-1])==1)  {return false;}   //前后ascii码差值绝对值为1表示连续
}
}
 
 
验证密码强度的js在网上挺多的
JavaScript code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function checkRank(val){
   if(val.length<6||/^[0-9]{1,8}$/.test(val))
   {
        showPwRank(0);
        return 0;
   }
   var ls = 0;
   if (val.match(/[a-z]/g)){ ls++; }
   if(val.match(/[A-Z]/g)){ ls++; } 
   if (val.match(/[0-9]/g)){ ls++; }
   if (val.match(/[^a-zA-Z0-9]/g)){ ls++; }
   if (val.length < 8 && ls > 1){  ls = 1;   } 
   if(ls>3) {   ls=3; };
   return ls; 
    }
 
密码为6位纯数字,且不能连续重复;即去掉了000000~999999这10种情况
^(?=.*\d+)(?!.*?([\d])\1{5})[\d]{6}$
 
(\d)\1就等价于(?<k1>\d)\k<k1>
这个是用了两个零宽断言,按这个正则的话.*和.*?可以去掉,跟下面是一样的结果
Plain Text code
 
?
1
^(?=\d+)(?!([\d])\1{5})[\d]{6}$
^(?=\d+) 后面必须是一个以上的数字
^(?!([\d])\1{5})后面不能六位数字相同

 

posted @ 2018-07-31 09:19  sundaysios  阅读(2323)  评论(0)    收藏  举报