判斷字符串中的數字是否相同,連續


 
最近幾天在寫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})后面不能六位數字相同

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM