最近几天在写pin code和指纹登录功能,一直没有时间总结技术,今天终于有点时间了。
我们的pin code的规则如下图所示:
我在网上找了这方面的正则,可惜没有,看来正则表达式不是万能的啊,哈哈!不过还是有收获的,我找到了一个判断数字是否相同的表达式,用着挺爽的。"^(?=.\d+)(?!.?([\d])\1{4})[\d]{5}$",贴出来与大家共享。
先说一下我对这个问题的解决思路:
- 我们先进行判重,怎么进行判重呢,首先我们需要把字符串中的数字切割成单独的数字,放入到数组中,这样你是不是有点思路了呢?我们可以利用for循环,用数组中的第一个元素和其他元素一一进行比较,如果有不相等的说明这个字符串的数字是不相同的。
-
再判断数字是否连续的,这个需要我们分成两部分来判断:递增连续、递减连续。
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 issuer; } + (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; } returnNO; } //判断是否相等 + (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;
}