兴趣iOS

iOS开发常用方法(正则匹配)

2016-11-28  本文已影响51人  沧海的风

写在前面

正则表达式常见字符

  test                   # 匹配包含test的字符串
  .                      # 匹配除换行符外任意字符
  \                      # 转义字符 
  [abc]或[a-c]           # 匹配字符类,如例子匹配a,b,c中的任何一个 
  [^abc]                 # 匹配除了a,b,c以外的所有字符

正则表达式特殊字符

  \d                  # 数字,等同于[0-9]
  \D                  # 非数字
  \s                  # 空白字符(包括换行、Tab等)
  \S                  # 非空白字符
  \w                  # 单词,等用于[a-zA-Z0-9_]
  \W                  # 非单词

正则表达式数量词

  c*                  # 匹配字符"c" 0或无限次
  c+                  # 匹配字符"c" 1次以上
  c?                  # 匹配字符"c" 0或1次
  c{3}                # 匹配字符"c" 3次
  c{3,5}              # 匹配字符"c" 3到5次

正则表达式边界匹配

  ^abc                # 匹配"abc"开头的字符串
  abc$                # 匹配"abc"结尾的字符串

iOS中的NSRegularExpression这个类

邮箱校验

+ (BOOL)validateUserEmail:(NSString *)str {
   NSString *email = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
   NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
   return [emailTest evaluateWithObject:str];
}

手机号校验

+  (BOOL)validateMobile:(NSString *)mobile {
    //手机号以13、15、18开头,八个\d数字字符
    NSString *phone = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
    return [phoneTest evaluateWithObject:mobile];
}

身份证校验

+  (BOOL)validateIdentityStringValid:(NSString *)identityString {    
    if (identityString.length != 18)
        return NO;
    // 正则表达式判断基本 身份证号是否满足格式
    NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
    NSPredicate *identityStringPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    //如果通过该验证,说明身份证格式正确,但准确性还需计算
    if (![identityStringPredicate evaluateWithObject:identityString])
    return NO;

    //** 开始进行校验 *//

    //将前17位加权因子保存在数组里
    NSArray *idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];

    //这是除以11后,可能产生的11位余数、验证码,也保存成数组
    NSArray *idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];

    //用来保存前17位各自乖以加权因子后的总和
    NSInteger idCardWiSum = 0;
    for(int i = 0; i < 17; i++) {
        NSInteger subStrIndex = [[identityString substringWithRange:NSMakeRange(i, 1)] integerValue];
        NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
        idCardWiSum+= subStrIndex * idCardWiIndex;
    }

    //计算出校验码所在数组的位置
    NSInteger idCardMod=idCardWiSum%11;
    //得到最后一位身份证号码
     NSString *idCardLast= [identityString substringWithRange:NSMakeRange(17, 1)];
   //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
    if (idCardMod==2) {
          if (![idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]) {
            return NO;
         }
    } else {
      //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
          if (![idCardLast isEqualToString: [idCardYArray ob  jectAtIndex:idCardMod]]) {
              return NO;
           }
     }
     return YES;
}

是否含有非法字符(文字、字母、数字除外)

+ (BOOL)validateSpecialCharacters:(NSString *)string {
    NSString *regex = @"^[A-Za-z0-9\\u4e00-\u9fa5]+$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if(![pred evaluateWithObject:string]) {
        return YES
    }
   return NO;
}

URL校验

+ (BOOL)validateURL:(NSString *)url {
  NSString *pattern = @"^[0-9A-Za-z]{1,50}";
  NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
  BOOL isMatch = [pred evaluateWithObject:url];
  return isMatch;
}
上一篇下一篇

猜你喜欢

热点阅读