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

发布时间 - 2026-01-11 01:51:10    点击率:

在某些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开发中常见的正则表达式的验证方法,如果写的有问题,还请大家及时指正。


# IOS  # 常用正则表达式  # IOS正则表达式验证  # IOS正则表达式验证方法  # iOS中正则表达式的运用示例代码  # IOS中用正则表达式判断输入的内容为8-16位且同时包含数字和字母  # 浅谈iOS应用中的相关正则及验证  # iOS 正则表达式判断手机号码、固话  # iOS 正则表达式判断纯数字及匹配11位手机号码的方法  # IOS正则表达式判断输入类型(整理)  # iOS开发验证判断语句之正则表达式小结  # iOS开发 正则运算详细介绍  # iOS 正则表达式详解  # IOS开发常用的正则表达式  # iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容  # IOS中NSPredicate和NSRegularExpression校验正则表达式区别  # 卡号  # 出生日期  # 校验位  # 正则表达式  # 军官证  # 再加上  # 请输入  # 自定义  # 大家分享  # 再做  # 还请  # 身份证号码  # 性问题  # 校验码  # 银联卡  # 收录了  # 在某些  # u7b2c  # u653f  # u540e 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  使用spring连接及操作mongodb3.0实例  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel如何实现API速率限制?(Rate Limiting教程)  如何确保西部建站助手FTP传输的安全性?  Python函数文档自动校验_规范解析【教程】  EditPlus 正则表达式 实战(3)  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何在云服务器上快速搭建个人网站?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  魔毅自助建站系统:模板定制与SEO优化一键生成指南  javascript中对象的定义、使用以及对象和原型链操作小结  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何用景安虚拟主机手机版绑定域名建站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel怎么判断请求类型_Laravel Request isMethod用法  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在局域网内绑定自建网站域名?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在腾讯云服务器上快速搭建个人网站?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  phpredis提高消息队列的实时性方法(推荐)  如何在IIS中新建站点并配置端口与物理路径?  Android okhttputils现在进度显示实例代码  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  网站制作壁纸教程视频,电脑壁纸网站?  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何使用模型观察者?(Observer代码示例)  Android自定义listview布局实现上拉加载下拉刷新功能  如何在宝塔面板中修改默认建站目录?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  5种Android数据存储方式汇总  详解Oracle修改字段类型方法总结  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  高端云建站费用究竟需要多少预算?  iOS验证手机号的正则表达式  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何快速查询网址的建站时间与历史轨迹?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel用户密码怎么加密_Laravel Hash门面使用教程  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  海南网站制作公司有哪些,海口网是哪家的?  如何快速上传自定义模板至建站之星?