使用NSRegularExpression / RegEx来验证邮政编码

时间:2015-08-11 23:31:22

标签: ios regex validation nsregularexpression

我有以下两种方法,我使用两个单独的模式调用NSRegularExpression(第一次使用此方法),一种用于检查加拿大和其他美国邮政编码。

-(BOOL)isValidPostalCode:(NSString*)code
{
    BOOL isValid = NO;
    NSString *cdnCheck = @"^[ABCEGHJKLMNPRSTVXY]\d[A-Z][- ]*\d[A-Z]\d$";
    NSString *usCheck  = @"^\d{5}(-\d{4})?$";

    if ([self validateString:code withPattern:cdnCheck] || [self validateString:code withPattern:usCheck]) {
        isValid = YES;
    }

    return isValid;
}

- (BOOL)validateString:(NSString *)string withPattern:(NSString *)pattern
{
    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
    if (error)
    {
        NSLog(@"Couldn't create regex with given string and options");
    }

    NSRange textRange = NSMakeRange(0, string.length);
    NSRange matchRange = [regex rangeOfFirstMatchInString:string options:NSMatchingReportProgress range:textRange];
    NSTextCheckingResult *resultString = [regex firstMatchInString:string options:0 range:textRange];

    BOOL didValidate = NO;
    if (matchRange.location != NSNotFound) {
        didValidate = YES;
    }

    return didValidate;
}

在第二种方法中,matchRange的长度总是 0 (我认为这是不匹配的指示符?),而resultString总是 nil ...而我无法弄清楚为什么。

我做错了什么?

- 免责声明 -

a)我传递一个字符串 - 没有空格 - 例如'V6E1H8'或'90210',所以这些是有效的候选人

b)是的,我知道这些是第二种方法中的冗余检查,我只是使用Class Reference中的各种其他选项进行调试,并考虑将其留在那里......

c)仅供参考,我从this answer得到了表达式(还有更多),他们查看http://regexpal.com/,所以我假设模式本身是有效的,这是一个问题我的逻辑(对于NSRange如何工作以及NSRegEx(借助速记)如何评估有效结果,我确实有点模糊......

0 个答案:

没有答案
相关问题