iOSRegex驗證手機號、郵箱、社會安全號碼等_IOS

來源:互聯網
上載者:User

本文執行個體為大家分享了常用的iOSRegex,供大家參考,具體內容如下

#import "NSString+RegexCategory.h"@implementation NSString (RegexCategory)#pragma mark - 正則相關- (BOOL)isValidateByRegex:(NSString *)regex{  NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];  return [pre evaluateWithObject:self];}#pragma mark -//手機號分服務商- (BOOL)isMobileNumberClassification{  /**   * 手機號碼   * 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188,1705   * 聯通:130,131,132,152,155,156,185,186,1709   * 電信:133,1349,153,180,189,1700   */  //  NSString * MOBILE = @"^1((3//d|5[0-35-9]|8[025-9])//d|70[059])\\d{7}$";//總況    /**   10     * 中國移動:China Mobile   11     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188,1705   12     */  NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d|705)\\d{7}$";  /**   15     * 中國聯通:China Unicom   16     * 130,131,132,152,155,156,185,186,1709   17     */  NSString * CU = @"^1((3[0-2]|5[256]|8[56])\\d|709)\\d{7}$";  /**   20     * 中國電信:China Telecom   21     * 133,1349,153,180,189,1700   22     */  NSString * CT = @"^1((33|53|8[09])\\d|349|700)\\d{7}$";      /**   25     * 大陸地區固話及小靈通   26     * 區號:010,020,021,022,023,024,025,027,028,029   27     * 號碼:七位或八位   28     */  NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";      //  NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];    if (([self isValidateByRegex:CM])    || ([self isValidateByRegex:CU])    || ([self isValidateByRegex:CT])    || ([self isValidateByRegex:PHS]))  {    return YES;  }  else  {    return NO;  }}//手機號有效性- (BOOL)isMobileNumber{  /**   * 手機號以13、15、18、170開頭,8個 \d 數字字元   * 小靈通 區號:010,020,021,022,023,024,025,027,028,029 還有未設定的新區號xxx   */  NSString *mobileNoRegex = @"^1((3\\d|5[0-35-9]|8[025-9])\\d|70[059])\\d{7}$";//除4以外的所有個位整數,不能使用[^4,\\d]匹配,這裡是否iOS Bug?  NSString *phsRegex =@"^0(10|2[0-57-9]|\\d{3})\\d{7,8}$";    BOOL ret = [self isValidateByRegex:mobileNoRegex];  BOOL ret1 = [self isValidateByRegex:phsRegex];    return (ret || ret1);}//郵箱- (BOOL)isEmailAddress{  NSString *emailRegex = @"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";  return [self isValidateByRegex:emailRegex];}//社會安全號碼- (BOOL) simpleVerifyIdentityCardNum{  NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";  return [self isValidateByRegex:regex2];}//車牌- (BOOL)isCarNumber{  //車牌號:湘K-DE829 香港車牌號碼:粵Z-J499港  NSString *carRegex = @"^[\u4e00-\u9fff]{1}[a-zA-Z]{1}[-][a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fff]$";//其中\u4e00-\u9fa5表示unicode編碼中漢字已編碼部分,\u9fa5-\u9fff是保留部分,將來可能會添加  return [self isValidateByRegex:carRegex];}- (BOOL)isMacAddress{  NSString * macAddRegex = @"([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}";  return [self isValidateByRegex:macAddRegex];}- (BOOL)isValidUrl{  NSString *regex = @"^((http)|(https))+:[^\\s]+\\.[^\\s]*$";  return [self isValidateByRegex:regex];}- (BOOL)isValidChinese;{  NSString *chineseRegex = @"^[\u4e00-\u9fa5]+$";  return [self isValidateByRegex:chineseRegex];}- (BOOL)isValidPostalcode {  NSString *postalRegex = @"^[0-8]\\d{5}(?!\\d)$";  return [self isValidateByRegex:postalRegex];}- (BOOL)isValidTaxNo{  NSString *taxNoRegex = @"[0-9]\\d{13}([0-9]|X)$";  return [self isValidateByRegex:taxNoRegex];}- (BOOL)isValidWithMinLenth:(NSInteger)minLenth          maxLenth:(NSInteger)maxLenth       containChinese:(BOOL)containChinese    firstCannotBeDigtal:(BOOL)firstCannotBeDigtal;{  // [\u4e00-\u9fa5A-Za-z0-9_]{4,20}  NSString *hanzi = containChinese ? @"\u4e00-\u9fa5" : @"";  NSString *first = firstCannotBeDigtal ? @"^[a-zA-Z_]" : @"";    NSString *regex = [NSString stringWithFormat:@"%@[%@A-Za-z0-9_]{%d,%d}", first, hanzi, (int)(minLenth-1), (int)(maxLenth-1)];  return [self isValidateByRegex:regex];}- (BOOL)isValidWithMinLenth:(NSInteger)minLenth          maxLenth:(NSInteger)maxLenth       containChinese:(BOOL)containChinese       containDigtal:(BOOL)containDigtal       containLetter:(BOOL)containLetter   containOtherCharacter:(NSString *)containOtherCharacter    firstCannotBeDigtal:(BOOL)firstCannotBeDigtal;{  NSString *hanzi = containChinese ? @"\u4e00-\u9fa5" : @"";  NSString *first = firstCannotBeDigtal ? @"^[a-zA-Z_]" : @"";  NSString *lengthRegex = [NSString stringWithFormat:@"(?=^.{%@,%@}$)", @(minLenth), @(maxLenth)];  NSString *digtalRegex = containDigtal ? @"(?=(.*\\d.*){1})" : @"";  NSString *letterRegex = containLetter ? @"(?=(.*[a-zA-Z].*){1})" : @"";  NSString *characterRegex = [NSString stringWithFormat:@"(?:%@[%@A-Za-z0-9%@]+)", first, hanzi, containOtherCharacter ? containOtherCharacter : @""];  NSString *regex = [NSString stringWithFormat:@"%@%@%@%@", lengthRegex, digtalRegex, letterRegex, characterRegex];  return [self isValidateByRegex:regex];}#pragma mark - 演算法相關//精確的社會安全號碼碼有效性檢測+ (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 false;  }      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;  }}/** 銀行卡號有效性問題Luhn演算法 * 現行 16 位銀聯卡現行卡號開頭 6 位是 622126~622925 之間的,7 到 15 位是銀行自訂的, * 可能是發卡分行,發卡網點,發卡序號,第 16 位是校正碼。 * 16 位卡號校正位採用 Luhm 校正方法計算: * 1,將未帶校正位的 15 位卡號從右依次編號 1 到 15,位於奇數位號上的數字乘以 2 * 2,將奇位乘積的個十位全部相加,再加上所有偶數位上的數字 * 3,將加法和加上校正位能被 10 整除。 */- (BOOL)bankCardluhmCheck{  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;}- (BOOL)isIPAddress{  NSString *regex = [NSString stringWithFormat:@"^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$"];  NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];  BOOL rc = [pre evaluateWithObject:self];    if (rc) {    NSArray *componds = [self componentsSeparatedByString:@","];        BOOL v = YES;    for (NSString *s in componds) {      if (s.integerValue > 255) {        v = NO;        break;      }    }        return v;  }    return NO;}@end

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.