我需要在java中验证邮政编码。我谷歌了一下,有很多正则表达式。
我的问题是所需的邮政编码模式可能会从一些管理设置页面改变。例如,在某些情况下,我们可能需要用户以XXX - XXX格式输入邮政编码,或者可能是(XXXXXX)等。
在某些情况下,邮政编码可以仅由数字组成,在某些情况下,可以由alpha数字组成。
请帮。
遗憾的是,没有很好的邮政地址本地化支持,包括邮政编码(又名邮政编码)。这篇博文(大约一年前,但不幸的是,仍然是相关的)描述了邮政地址验证的糟糕状态。在美国,邮政服务提供他们的地址验证API;基于web的协议。我所知道的另一个工具是一个名为libaddressinput的Android库。项目总结说,虽然UI是android专用的,但后端是可以重用的。
由于没有很好的工具,这里有一些代码可以在不使用regex的情况下将一些模式应用于邮政编码。您可以使用servlet提供的模式,但为了清晰起见,在示例中显示了它。
虽然你的问题没有指定国家,但我将发布一个美国邮政编码,因为这些模式对我来说很熟悉:
public static boolean isProbablyValidUSZipCode(CharSequence zip) {
String[] patterns = {"#####", "#####-####", "##### ####", "#########"};
try {
for (String pattern : patterns) {
if (checkAgainstPattern(zip, pattern)) {
return true;
}
}
return false;
}
catch (NullPointerException ignored) {
return false;
}
}
private static boolean checkAgainstPattern(CharSequence s, CharSequence pattern) {
if (s.length() != pattern.length()) {
return false;
}
for (int i = 0; i < pattern.length(); i++) {
char c = s.charAt(i);
switch (pattern.charAt(i)) {
case '#':
if (!Character.isDigit(c)) {
return false;
}
break;
default:
if (c != pattern.charAt(i)) {
return false;
}
}
}
return true;
}
允许字母数字,可以将Character.isDigit
改为Character.isLetterOrDigit
。然而,如果不同的国家有不同的限制(它们确实有),情况就会变得很糟糕。