我有以下两种方法,我使用两个单独的模式调用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(借助速记)如何评估有效结果,我确实有点模糊......