4

我想知道有什么方法可以验证美国的邮政编码或加拿大的邮政编码吗?我尝试使用正则表达式。喜欢美国

- (BOOL)validateZip:(NSString *)candidate {
    NSString *emailRegex = @"(^{5}(-{4})?$)|(^[ABCEGHJKLMNPRSTVXY][A-Z][- ]*[A-Z]$)";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];   
}

但它不起作用。请任何人对此验证有任何想法。是否有任何其他 api 用于验证?如果可能,请指导我?

4

2 回答 2

12

对于美国,您的量词 ( {5}, {4}, ?) 是正确的,但忘记具体说明您要量化的内容。你要:

(^[0-9]{5}(-[0-9]{4})?$)

对于加拿大,根据维基百科,格式是A0A 0A0,所以我会这样做:

(^[a-zA-Z][0-9][a-zA-Z][- ]*[0-9][a-zA-Z][0-9]$)

现在,我会像这样编写完整的表达式,启用不区分大小写:

@"^(\\d{5}(-\\d{4})?|[a-z]\\d[a-z][- ]*\\d[a-z]\\d)$"

坦率地说,我实际上并不熟悉 Objective C 或 iOS,遗憾的是我还没有测试过上述内容。但是,以前我看到过这样的帖子提到NSRegularExpression,您的代码中缺少它,但也许没有必要。看看其他人的例子,看看你可能犯的其他简单错误。祝你好运。

于 2012-10-15T14:39:07.427 回答
1

我们使用了它,但它仅用于英国邮政编码。请参阅@acheong87 答案以更改正则表达式以适合您的标准和其他好的答案。

NSString *postcodeRegex = @"[A-Z]{1,2}[0-9R][0-9A-Z]?([0-9][ABD-HJLNP-UW-Z]{2}";//WITH SPACES
NSPredict *postcodeValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", postcodeRegex];

if ([postcodeValidate evaluateWithObject:postcodeField.text] == YES) {  
     NSLog (@"Postcode is Valid");  
} else {  
     NSLog (@"Postcode is Invalid");    
}

我建议您首先使用这个很棒的工具http://www.regexr.com测试正则表达式

编辑

经过进一步测试,当前的正则表达式不支持邮政编码中的空格。这将解决该问题。

NSString *postcodeRegex = @"[A-Z]{1,2}[0-9R][0-9A-Z]?(\s|)([0-9][ABD-HJLNP-UW-Z]{2}";//WITH SPACES
于 2014-02-27T01:04:35.370 回答