iOS中常见正则表达式验证方法

在某些App应用里面需要填写用户信息(用于验证),有身份证、手机号、军官证等等。下面来跟大家分享一下各自的验证方式。

1.验证 手机号码 ,这个是对任意输入的一串数字做验证,返回一个识别结果(字符串),根据这个结果再做判断。

//判断手机号码
+ (NSString *)valiMobile:(NSString *)mobile{
  if (mobile.length != 11){
    return @"手机号码格式错误";
  }else{
    /**
     * 移动号段正则表达式
     */
    NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";
    /**
     * 联通号段正则表达式
     */
    NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";
    /**
     * 电信号段正则表达式
     */
    NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];
    BOOL isMatch1 = [pred1 evaluateWithObject:mobile];
    NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];
    BOOL isMatch2 = [pred2 evaluateWithObject:mobile];
    NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
    BOOL isMatch3 = [pred3 evaluateWithObject:mobile];
    if (isMatch1 || isMatch2 || isMatch3) {
      return nil;
    }else{
      return @"请输入正确的手机号码";
    }
  }
  return nil;
}

2.验证军官证

//验证军官证
- (BOOL) checkOfficerCard: (NSString *) officerCard{
  //exp:政字第00111206号
  BOOL flag;
  if (officerCard.length <= 0) {
    flag = NO;
    return flag;
  }
  NSString *regex2 = @"^([\u5357|\u5317|\u6c88|\u5170|\u6210|\u6d4e|\u5e7f|\u6d77|\u7a7a|\u53c2|\u653f|\u540e|\u88c5][\u5b57][\u7b2c]\\d{8}[\u53f7])$";
  NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
  return [identityCardPredicate evaluateWithObject:officerCard];
}

3.验证身份证,这个是 真实身份证 的验证方法,具有唯一性。

//精确的身份证号码有效性检测
- (BOOL) accurateVerifyIDCardNumber:(NSString *)value {
  value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  int length =0;
  if (!value) {
    return NO;
  }else {
    length = (int)value.length;
    if (length !=15 && length !=18) {
      return NO;
    }
  }
  // 省份代码
  NSArray *areasArray =@[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41", @"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];
  NSString *valueStart2 = [value substringToIndex:2];
  BOOL areaFlag =NO;
  for (NSString *areaCode in areasArray) {
    if ([areaCode isEqualToString:valueStart2]) {
      areaFlag =YES;
      break;
    }
  }
  if (!areaFlag) {
    return NO;
  }
  NSRegularExpression *regularExpression;
  NSUInteger numberofMatch;

  int year =0;
  switch (length) {
    case 15:
      year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;

      if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

        regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
                                     options:NSRegularExpressionCaseInsensitive
                                      error:nil];//测试出生日期的合法性
      }else {
        regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
                                    options:NSRegularExpressionCaseInsensitive
                                     error:nil];//测试出生日期的合法性
      }
      numberofMatch = [regularExpression numberOfMatchesInString:value
                                options:NSMatchingReportProgress
                                 range:NSMakeRange(0, value.length)];

      if(numberofMatch >0) {
        return YES;
      }else {
        return NO;
      }
    case 18:
      year = [value substringWithRange:NSMakeRange(6,4)].intValue;
      if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

        regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"
                                     options:NSRegularExpressionCaseInsensitive
                                      error:nil];//测试出生日期的合法性
      }else {
        regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"
                                     options:NSRegularExpressionCaseInsensitive
                                      error:nil];//测试出生日期的合法性
      }
      numberofMatch = [regularExpression numberOfMatchesInString:value
                                options:NSMatchingReportProgress
                                 range:NSMakeRange(0, value.length)];

      if(numberofMatch >0) {
        int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
        int Y = S %11;
        NSString *M =@"F";
        NSString *JYM =@"10X98765432";
        M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判断校验位
        if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {
          return YES;// 检测ID的校验位
        }else {
          return NO;
        }

      }else {
        return NO;
      }
    default:
      return NO;
  }
}

4.邮箱的验证

//邮箱验证
- (BOOL)isEmailAddress{
  NSString *emailRegex = @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches %@",emailRegex];
  return [predicate evaluateWithObject:self];
}

5.银行卡有效性验证。这里是给 NSString 写的分类

/** 银行卡号有效性问题Luhn算法
 * 现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的,
 * 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。
 * 16 位卡号校验位采用 Luhm 校验方法计算:
 * 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
 * 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
 * 3,将加法和加上校验位能被 10 整除。
 */
- (BOOL)bankCardCheck{
  NSString * lastNum = [[self substringFromIndex:(self.length-1)] copy];//取出最后一位
  NSString * forwardNum = [[self substringToIndex:(self.length -1)] copy];//前15或18位

  NSMutableArray * forwardArr = [[NSMutableArray alloc] initWithCapacity:0];
  for (int i=0; i<forwardNum.length; i++) {
    NSString * subStr = [forwardNum substringWithRange:NSMakeRange(i, 1)];
    [forwardArr addObject:subStr];
  }

  NSMutableArray * forwardDescArr = [[NSMutableArray alloc] initWithCapacity:0];
  for (int i = (int)(forwardArr.count-1); i> -1; i--) {//前15位或者前18位倒序存进数组
    [forwardDescArr addObject:forwardArr[i]];
  }

  NSMutableArray * arrOddNum = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 < 9
  NSMutableArray * arrOddNum2 = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 > 9
  NSMutableArray * arrEvenNum = [[NSMutableArray alloc] initWithCapacity:0];//偶数位数组

  for (int i=0; i< forwardDescArr.count; i++) {
    NSInteger num = [forwardDescArr[i] intValue];
    if (i%2) {//偶数位
      [arrEvenNum addObject:[NSNumber numberWithInteger:num]];
    }else{//奇数位
      if (num * 2 < 9) {
        [arrOddNum addObject:[NSNumber numberWithInteger:num * 2]];
      }else{
        NSInteger decadeNum = (num * 2) / 10;
        NSInteger unitNum = (num * 2) % 10;
        [arrOddNum2 addObject:[NSNumber numberWithInteger:unitNum]];
        [arrOddNum2 addObject:[NSNumber numberWithInteger:decadeNum]];
      }
    }
  }

  __block NSInteger sumOddNumTotal = 0;
  [arrOddNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
    sumOddNumTotal += [obj integerValue];
  }];

  __block NSInteger sumOddNum2Total = 0;
  [arrOddNum2 enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
    sumOddNum2Total += [obj integerValue];
  }];

  __block NSInteger sumEvenNumTotal =0 ;
  [arrEvenNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
    sumEvenNumTotal += [obj integerValue];
  }];

  NSInteger lastNumber = [lastNum integerValue];

  NSInteger luhmTotal = lastNumber + sumEvenNumTotal + sumOddNum2Total + sumOddNumTotal;

  return (luhmTotal%10 ==0)?YES:NO;
}

以上简单的收录了在iOS开发中常见的正则表达式的验证方法,如果写的有问题,还请大家及时指正。

(0)

相关推荐

  • iOS验证手机号的正则表达式

    本文实例为大家分享了iOS正则验证手机号的代码片段,供大家参考,具体内容如下 //判断手机号码格式是否正确 + (BOOL)valiMobile:(NSString *)mobile { mobile = [mobile stringByReplacingOccurrencesOfString:@" "withString:@""]; if (mobile.length != 11) { return NO; }else{ /** * 移动号段正则表达式 */ NS

  • iOS 正则表达式判断纯数字及匹配11位手机号码的方法

    第一种使用正则表达式 判断 //是否是纯数字 + (BOOL)isNumText:(NSString *)str{ NSString * regex = @"(/^[0-9]*$/)"; NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; BOOL isMatch = [pred evaluateWithObject:str]; if (isMatch)

  • iOS 正则表达式判断手机号码、固话

    话不多说,请看代码: { if (mobileNum.length != 11) { return NO; } /** * 手机号码: * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9] * 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 * 联通号段: 130

  • IOS开发常用的正则表达式

    正则表达式是一种用来进行文本匹配的工具,其语法优美简洁.在开发中,查找.对比以及匹配字符串是家常便饭的业务,通过正则表达式我们将这些业务描述成某些需求规则,来让我们的代码更美观.实用.例如我们要验证用户输入的密码长度是否满足6~18位的长度,新手最常见的验证方式是判断输入的密码长度 return (textField.text.length >= 6 && textField.text.leng <= 18); 尽管这种判断方式没有任何问题,而上面的验证换做正则表达式的匹配字符

  • IOS正则表达式判断输入类型(整理)

    在开发过程中,有时需要对用户输入的类型做判断,最常见是在注册页面即用户名和密码,代码整理如下: 只能为中文 -(BOOL)onlyInputChineseCharacters:(NSString*)string{ NSString *zhString = @"[\u4e00-\u9fa5]+"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",zhString]

  • iOS 中使用正则表达式判断身份证格式及银行卡号格式是否正确(推荐)

    1.有时候我们会用到上传身份证号,或者银行卡号,这个时候就需要我们对身份证号以及银行卡号,进行基本的判断. 下面便是身份证号的判断返回YES是合法,反之不合法 #pragma mark 判断身份证号是否合法 - (BOOL)judgeIdentityStringValid:(NSString *)identityString { if (identityString.length != 18) return NO; // 正则表达式判断基本 身份证号是否满足格式 NSString *regex2

  • iOS 正则表达式详解

    一.系统自带正则表达式用法 除了正则可以用,还有NSScanner这个类可以达到某些相同的效果 1.创建正则表达式对象 NSString * reg = @"[0-9]+";//字符串正则表达式NSError *error = NULL;//错误对象NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reg options:NSRegularExpressionCaseInsens

  • iOS正则表达式验证手机号、邮箱、身份证号等

    本文实例为大家分享了常用的iOS正则表达式,供大家参考,具体内容如下 #import "NSString+RegexCategory.h" @implementation NSString (RegexCategory) #pragma mark - 正则相关 - (BOOL)isValidateByRegex:(NSString *)regex{ NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCH

  • iOS开发验证判断语句之正则表达式小结

    前言 大家都知道开发一直离不开一些常用验证格式,比如:邮箱,手机号等等,在开发过程中一般都会新建一个工具类,专门管理这些验证方式,简便开发过程.一般都采用正则表达式的形式来做判断,本文列举一些项目中非常实用的一些正则表达式的判断语句,以后开发起来直接复制粘贴就可以,这样大大节省了开发时间,下面不多说,直接上代码. 一.验证移动手机号: + (BOOL)isMobile:(NSString*)mobile { NSString *regex = @"^1+[34578]+\d{9}";

  • iOS中常见正则表达式验证方法

    在某些App应用里面需要填写用户信息(用于验证),有身份证.手机号.军官证等等.下面来跟大家分享一下各自的验证方式. 1.验证 手机号码 ,这个是对任意输入的一串数字做验证,返回一个识别结果(字符串),根据这个结果再做判断. //判断手机号码 + (NSString *)valiMobile:(NSString *)mobile{ if (mobile.length != 11){ return @"手机号码格式错误"; }else{ /** * 移动号段正则表达式 */ NSStri

  • iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容

    何谓正则表达式 正则表达式(regular expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的.正则表达式通常缩写成"regex",单数有regexp.regex,复数有regexps.regexes.regexen. 正则表达式组成 正则表达式有两种类型的字符

  • iOS中常见的几种加密方法总结

    前言 在我们日常开发中,加密是必不可少的一部分,而普通加密方法是讲密码进行加密后保存到用户偏好设置中,钥匙串是以明文形式保存,但是不知道存放的具体位置,下面本文将详细给大家介绍iOS中常见的几种加密方法,下面话不多说了,来一起看看详细的介绍吧. 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组表示数据,改为 6个bit一组表示数据,不足的部分补零,每 两个0 用 一个 = 表示 用base64 编码之后,数据长度会变大,增加了大约 1/3 左右.

  • iOS中关于Cookie验证登录状态

    1.第一次进入应用,登录获取Cookie,此时如果用到的是AFN去获取接口数据,Cookie已经写入了,所以无需处理,每次请求的时候,会自动将该cookie传给后台去验证 2.将Cookie缓存到本地: NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]]; NSUserDefaults *default

  • IOS 中KVC的使用方法实例详解

    IOS 中KVC的使用方法实例详解 KVC是Key Value Coding的缩写,意思是键值编码.在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象的属性方法.说的有的拗口,实际上就是通过类定义我们可以看到类的各种属性,那么使用属性的名称我们就能访问到类实例化后的对象的这个属性值. 这个方法可以不通过getter/setter方法来访问对象的属性.因为一个类的成员变量如果没有提供getter/setter的话,外界就失去了对这个变量的访问渠道.而KVC则提供了一种访问的

  • Element UI 自定义正则表达式验证方法

    如下所示: //指定数据中心的验证表单valiForm,验证规则rules <el-form :model="valiForm" :rules="rules" ref="valiForm" label-width="100px" class="demo-valiForm"> <el-form-item label="名称:" :label-width="for

  • Js中使用正则表达式验证输入是否有特殊字符

    Js中使用正则表达式验证输入是否有特殊字符的代码如下所示: //验证是否有特殊字符 function checkval(t) { var re = /^[\u4e00-\u9fa5a-z]+$/gi;//只能输入汉字和英文字母 if (re.test(t)) { return true; } else { return false; } }  js正则表达式,验证同一字符串不同 var num = 888; var reg = /^[1-9]{1}[0-9]*$/g; console.log(r

  • iOS中视频播放的基本方法总结

    前言 本文总结了iOS中最常见的视频播放方法,不同的方法都各具特点,我希望能够总结它们的不同,方便在开发中选择合适的技术方案. Apple为我们提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等.而值得注意的是,上述的MPMoviePlayerController与MPMoviePlayerViewController在iOS9.0之后被弃用.虽

  • python中使用正则表达式的方法详解

    目录 search(pattern, string, flags=0) findall(pattern, string, flags=0) sub(pattern, repl, string, count=0, flags=0) compile(pattern, flags=0) flags的一些常用值 总结 在python中使用正则表达式,主要通过下面的几个方法 search(pattern, string, flags=0) 扫描整个string并返回匹配pattern的结果(None或对象

随机推荐