如何在iOS中validation美国或加拿大的Zipcode?

我想知道是否有任何方法来validation美国或加拿大邮政编码的邮政编码?我试图使用正则expression式。 像美国一样

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

但它不工作。请任何机构有任何关于这个validation的想法。如果有任何其余的API有validation?请指导我如果可能?

对美国来说,你有量词( {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]$) 

现在,我会写这样的完整expression式,并启用不区分大小写:

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

坦率地说,我实际上并不熟悉Objective C或iOS,可悲的是我还没有testing过上述内容。 不过,以前我见过这样的post提到NSRegularExpression ,这是你的代码中缺less,但也许是没有必要的。 看看别人的例子,看看你可能做了什么其他的简单的错误。 祝你好运。

我们使用这个,但它只适用于英国邮政编码。 请参阅@ acheong87答案来改变正则expression式以适应您的标准和其他好的答案。

 NSString *postcodeRegex = @"[AZ]{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"); } 

我build议你先使用这个伟大的工具http://www.regexr.comtesting正则expression式

编辑

当前正则expression式在进一步testing后不支持邮政编码中的空格。 这将解决这个问题。

 NSString *postcodeRegex = @"[AZ]{1,2}[0-9R][0-9A-Z]?(\s|)([0-9][ABD-HJLNP-UW-Z]{2}";//WITH SPACES