我需要在Java中验证邮政编码。我已经搜索了很多正则表达式。
我的问题是所需的邮政编码格式可能会从某些管理设置页面更改。例如,在某些情况下,我们可能需要用户以XXX-XXX或(XXXXXX)等格式输入邮政编码。
在某些情况下,邮政编码只能包含数字,而在某些情况下可以是字母数字混合的形式。
请帮忙。
我需要在Java中验证邮政编码。我已经搜索了很多正则表达式。
我的问题是所需的邮政编码格式可能会从某些管理设置页面更改。例如,在某些情况下,我们可能需要用户以XXX-XXX或(XXXXXX)等格式输入邮政编码。
在某些情况下,邮政编码只能包含数字,而在某些情况下可以是字母数字混合的形式。
请帮忙。
很遗憾,目前没有好的本地化支持邮政地址,包括邮政编码(也称为邮编)。这篇博客文章(虽然已经有一年了,但仍然不幸地相关)描述了邮政地址验证的糟糕状态。在美国,邮政服务提供他们的地址验证API;一个基于Web的协议。我所知道的唯一其他工具是一个名为libaddressinput的Android库。该项目摘要表示,虽然UI是特定于Android的,但后端可以被重用。
由于目前没有很好的工具可用,这里提供一些代码来应用一些邮政编码模式,而无需使用正则表达式。您可以从您的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
。然而,如果不同的国家有不同的限制(事实上是这样的),这可能会变得很麻烦。
当然,这种方法并不会查找不存在或以其他方式无效的邮政编码,但它比没有验证要好得多。如果您稍后找到某些查找服务,您可以在这些静态方法之后调用它,因为我想那可能会更昂贵。