2018-05-09 11:40:53 u013127850 阅读数 1548

/**

 *  检测用户输入密码是否以字母开头,6-18位数字和字母组合

 *正则匹配用户密码6-18位数字和字母组合

 *  @param pattern 传入需要检测的字符串

 *

 *  @return 返回检测结果 是或者不是

 */

+(BOOL)detectionIsPasswordQualified:(NSString *)patternStr{

    

    NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:patternStr];

    return isMatch;

    

}

2017-03-21 15:26:00 littlelittlepeng 阅读数 3096

在项目开发的过程中,我们经常会遇到对用户输入内容是否符合规范的判断,其中就包括对用户名或者密码的判断,比如要求用户输入的密码需要满足长度为多少位且同时包含数字和字母。然后我们可以通过正则表达式来解决这些问题。


例如密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。

如何分析需求?拆分!这就是软件设计的一般思路了。于是乎,拆分需求如下:
1,不能全部是数字
2,不能全部是字母
3,必须是数字或字母
只要能同时满足上面3个要求就可以了,写出来如下:


1

^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$

分开来注释一下:
^ 匹配输入字符串的开始位置
(?![0-9]+$) 预测该位置后面不全是数字
(?![a-zA-Z]+$) 预测该位置后面不全是字母
[0-9A-Za-z] {8,16} 由8-16位数字或这字母组成
$ 匹配行结尾位置

注:(?!xxxx) 是正则表达式的负向零宽断言一种形式,标识预该位置后不是xxxx字符。


用在iOS中的代码:

[objc] view plain copy
  1. **  
  2.  *  @author KaKa, 15-07-31 14:07:02  
  3.  *  
  4.  *  判断用户输入的密码是否符合规范,符合规范的密码要求:  
  5.     1. 长度大于8位  
  6.     2. 密码中必须同时包含数字和字母  
  7.  */  
  8. +(BOOL)judgePassWordLegal:(NSString *)pass{  
  9.     BOOL result = false;  
  10.     if ([pass length] >= 8){  
  11.         // 判断长度大于8位后再接着判断是否同时包含数字和字符  
  12.         NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";  
  13.         NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];  
  14.         result = [pred evaluateWithObject:pass];  
  15.     }  
  16.     return result;  
  17. }  
2016-05-10 22:46:52 qiny1010 阅读数 1575

最近做一个项目,由于之前设计密码太过简单很容易被破解,所以升级了下密码的复杂度,要求密码有英文键盘下的数字,字母或字符至少两种,对密码字符串进行验证

思路是用正则表达式,使用NSPredicate对象的evaluateWithObject方法

废话不多说,直接上代码

匹配 数字,字母或符号至少两种的6-20位字的符串

+ (BOOL) isSafePassword:(NSString *)strPwd{
    NSString *passWordRegex = @"^((?![0-9]+$)(?![a-zA-Z]+$)(?![~!@#$^&|*-_+=.?,]+$))[0-9A-Za-z~!@#$^&|*-_+=.?,]{6,20}$";   // 数字,字符或符号至少两种
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", passWordRegex];
    
    if ([regextestcm evaluateWithObject:strPwd] == YES)
    {
        return YES;
    }
    else
    {
        return NO;
    }

}

其中 (?!pattern)是断言的一种它表示的意义不全是,是负向匹配

相关的还有:

(?=pattern)是正向匹配 ,意思是匹配pattern的串如Windows (?=95|98|NT|2000)可以匹配Windows2000不能匹配 WindowsXp

(?:pattern)匹配是pattern的内容,如ndustr(?:y|ies) 可以匹配'industry|industries'


运行结果:


参考链接:

http://www.itnose.net/detail/6335000.html   匹配数字和字母包含两种

http://www.runoob.com/regexp/regexp-metachar.html  正则表达式资料

2016-12-14 09:47:03 weixin_37141881 阅读数 84
//计算总共字数和限制字数的Index位置
-(NSMutableArray *) unicodeLengthOfString: (NSString *) text
{
    NSMutableArray *array = [NSMutableArray array];
    float asciiLength = 0;
    NSInteger  maxmumShowIndex  = 0;
    for (NSUInteger i = 0; i < text.length; i++) {
        unichar uc = [text characterAtIndex: i];
        if (isalnum(uc)) {
            asciiLength += 1.1;
        }else{
            asciiLength += isascii(uc) ? 1 : 2;
        }
        //计算可以显示的最大字数的Index位置
        if (asciiLength /2 < _maxMumCharactors) {
            maxmumShowIndex =i;
        }
    }
    //所有的字数
    NSUInteger unicodeLength = asciiLength / 2;
    
    if((NSInteger)asciiLength % 2) {
        unicodeLength++; 
    } 
    
    [array addObject:[NSNumber numberWithInteger:unicodeLength]];
    [array addObject:[NSNumber numberWithInteger:maxmumShowIndex]];
    return array;
}

  代码解释: 设中文字数宽度为2, 非中文(isascii)宽度为1, 数字宽度为1.

     所有宽度之和为R, 所有字数之和为 H,  H = R / 2 + R%2,  

     上面的代码只是在计算刚刚超过限制字数时的Index位置。然后再截取或替换超过部分字符串。

  

  NSArray *titleTextLengthArray = [self unicodeLengthOfString:self.titleString];
    if ([[titleTextLengthArray firstObject] integerValue] >_maxMumCharactors) {
        NSInteger maxMumLength = [[titleTextLengthArray lastObject] integerValue];
        self.titleString = [self.titleString stringByReplacingCharactersInRange:NSMakeRange(maxMumLength, self.titleString.length-maxMumLength) withString:@"..."];
    }

    另外经过研究:self.titleString.length 其实是字符的个数。stringByReplacingCharactersInRange 这个方法也是针对字符数。 

      unichar uc = [text characterAtIndex: i]; 这个方法取的是具体的第几个字符。

      

     

  

 

2016-06-15 11:18:59 yutaotst 阅读数 1067

刚刚做项目用到正则表达式验证,总结了一些常用的


#import <Foundation/Foundation.h>

@interface Utils : NSObject

#pragma 正则匹配邮箱

+ (BOOL) checkEmail:(NSString *)email;

#pragma 正则匹配手机号

+ (BOOL)checkTelNumber:(NSString *) telNumber;

#pragma 正则匹配用户密码6-18位数字和字母组合

+ (BOOL)checkPassword:(NSString *) password;

#pragma 正则匹配用户姓名,20位的中文或英文

+ (BOOL)checkUserName : (NSString *) userName;

#pragma 正则匹配用户身份证号

+ (BOOL)checkUserIdCard: (NSString *) idCard;

#pragma 正则匹员工号,12位的数字

+ (BOOL)checkEmployeeNumber : (NSString *) number;

#pragma 正则匹配URL

+ (BOOL)checkURL : (NSString *) url;

@end


#import "Utils.h"


@implementation Utils


#pragma 正则匹配邮箱

+ (BOOL) checkEmail:(NSString *)email

{

    NSString *emailRegex =@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";

    NSPredicate *emailTest = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];

    return [emailTest evaluateWithObject:email];

}

#pragma 正则匹配手机号

+ (BOOL)checkTelNumber:(NSString *) telNumber

{

    NSString *pattern =@"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:telNumber];

    return isMatch;

}



#pragma 正则匹配用户密码6-20位数字和字母组合

+ (BOOL)checkPassword:(NSString *) password

{

    NSString *pattern =@"^[a-zA-Z0-9]{6,20}+$";

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:password];

    return isMatch;

    

}


#pragma 正则匹配用户姓名,20位的中文或英文

+ (BOOL)checkUserName : (NSString *) userName

{

    NSString *pattern =@"^[a-zA-Z-]{1,20}";

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:userName];

    return isMatch;

    

}



#pragma 正则匹配用户身份证号1518

+ (BOOL)checkUserIdCard: (NSString *) idCard

{

    NSString *pattern =@"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:idCard];

    return isMatch;

}


#pragma 正则匹员工号,12位的数字

+ (BOOL)checkEmployeeNumber : (NSString *) number

{

    NSString *pattern = @"^[0-9]{12}";

    

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:number];

    return isMatch;

    

}


#pragma 正则匹配URL

+ (BOOL)checkURL : (NSString *) url

{

    NSString *pattern =@"^[0-9A-Za-z]{1,50}";

    NSPredicate *pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

    BOOL isMatch = [pred evaluateWithObject:url];

    return isMatch;

    

}

@end


使用方法,在需要使用的类里面导入#import "Utils.h"

 

- (IBAction)loginClick:(id)sender {

    if ([UtilscheckTelNumber:_phoneTextField.text]) //匹配结果,YES

    {

       NSLog(@"手机号格式正确");

    }else{

        NSLog(@"手机号格式错误");

   }

}


没有更多推荐了,返回首页