如何在iOS中验证美国或加拿大的邮政编码?

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];   
}

但是它没有起作用。请问有人对这个验证有任何想法吗?如果有任何 REST API 用于验证,您能否指导我?

请查看这个答案 - Youssef
点击以下链接 http://stackoverflow.com/a/44038538/4402354,获取适用于Swift 3.0的内容。 - Chandu kumar.Alasyam
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,它在您的代码中缺失,但可能并非必要。请查看其他人的示例,看看您可能正在犯的其他简单错误。祝你好运。


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

我已经在商业应用程序中使用过它,从未听说过任何问题,所以是的。 - Joe Barbour
我输入了M22<空格>0XC,但它显示无效的邮政编码。 - Majid Bashir
@magic 你是对的,我刚刚测试了一下,不知道为什么它没有起作用。我刚刚更新了我的帖子,使用了一个稍微调整过的表达式。希望这能有所帮助。 - Joe Barbour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接