【问题标题】:How to check the validity of a GUID (or UUID) using NSRegularExpression or any other effective way in Objective-C如何使用 NSRegularExpression 或 Objective-C 中的任何其他有效方式检查 GUID(或 UUID)的有效性
【发布时间】:2014-01-06 07:37:36
【问题描述】:

如果 NSString 类似于 @"{A5B8A206-E14D-429B-BEB0-2DD0575F3BC0}",则该方法应返回 TRUE,而对于类似 @"bla bla bla" 的 NSString,该方法应返回 FALSE

我正在使用类似的东西:

- (BOOL)isValidGUID {

    NSError *error;

    NSRange range = [[NSRegularExpression regularExpressionWithPattern:@"(?:(\\()|(\\{))?\\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-Z0-9]{12}\\b(?(1)\\))(?(2)\\})" options:NSRegularExpressionCaseInsensitive error:&error] rangeOfFirstMatchInString:self.GUID options:0 range:NSMakeRange(0, [self.GUID length])];

    if (self.GUID && range.location != NSNotFound && [self.GUID length] == 38) {

        return TRUE;

    } else {

        return NO;
    }
}

但它没有像我预期的那样工作。

重要提示:我使用的 GUID 用大括号括起来,如下所示:{A5B8A206-E14D-429B-BEB0-2DD0575F3BC0}

【问题讨论】:

    标签: ios iphone objective-c regex nsregularexpression


    【解决方案1】:

    这个正则表达式适合我

    \A\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\}\Z
    

    简而言之:

    • \A\Z 是字符串的开头和结尾
    • \{\} 是转义大括号
    • [A-F0-9]{8} 正好是 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 中的 8 个字符

    作为一个 NSRegularExpression 它看起来像这样

    NSError *error = NULL;
    NSRegularExpression *regex = 
      [NSRegularExpression regularExpressionWithPattern:@"\\A\\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\\}\\Z" 
                                                options:NSRegularExpressionAnchorsMatchLines 
                                                  error:&error];
    // use the regex to match the string ...
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方法进行检查:

      - (BOOL)isUUID:(NSString *)inputStr
      {
          BOOL isUUID = FALSE;
          NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" options:NSRegularExpressionCaseInsensitive error:nil];
          NSInteger matches = [regex numberOfMatchesInString:inputStr options:0 range:NSMakeRange(0, [inputStr length])];
          if(matches == 1)
          {
             isUUID = TRUE;
          }
          return isUUID;
      }
      

      【讨论】:

        【解决方案3】:

        这个函数可以完成这项工作..

        -(BOOL)isValidUUID : (NSString *)UUIDString
        {
             return (bool)[[NSUUID alloc] initWithUUIDString:U‌​UIDString]; 
        }
        

        谢谢@Erzékiel

        【讨论】:

        • 对我来说很好用!它可以像这样最小化:return (bool)[[NSUUID alloc] initWithUUIDString:UUIDString];
        • 谢谢。这应该是一个公认的答案。在 iOS 9 上运行良好。
        • 简单明了。谢谢。
        【解决方案4】:

        考虑缩短的 UUID 格式。使用下面的代码:

        -(BOOL)isValidUUID:(NSString*)uuidString{   
        NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
        if (uuid ) {
            return YES;
        }
        
        NSError *error;
        NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:@"[^0-9|^a-f]" options:NSRegularExpressionCaseInsensitive error:&error];
        NSArray *matches = [reg matchesInString:uuidString options:NSMatchingReportCompletion range:NSMakeRange(0, uuidString.length)];
        
        if (matches.count == 0 && (uuidString.length == 4 || uuidString.length ==8) ) {
            return YES;
        }else{
            return NO;
        }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 2014-09-11
          相关资源
          最近更新 更多