如果邮政编码模式动态变化,如何在java中验证邮政编码?

时间:2011-11-21 06:34:57

标签: java validation pattern-matching zipcode

我需要在java中验证邮政编码。我用谷歌搜索了很多正则表达式。

我遇到的问题是所需的邮政编码模式可能会从某个管理员设置页面更改。在某些情况下,我们可能需要用户输入格式为XXX - XXX的邮政编码,或者可能是(XXXXXX)等。

在某些情况下,邮政编码只能包含数字,在某些情况下只能包含字母数字。

请帮忙。

2 个答案:

答案 0 :(得分:1)

不幸的是,邮政地址没有很好的本地化支持,包括邮政编码(也就是邮政编码)。 This blog post(大约一岁,但不幸的是,相关)描述了邮政地址验证的遗憾状态。在美国,邮政服务提供Address Validation API;基于网络的协议。我所知道的唯一其他工具是名为libaddressinput的Android库。项目摘要说,虽然UI是特定于Android的,但后端可以重复使用。

答案 1 :(得分:0)

由于没有出色的工具,这里有一些代码可以在不使用正则表达式的情况下将一些模式应用于邮政编码。您可以从servlet提供模式,但为了清楚起见,它在示例中显示。

虽然您的问题未指定国家/地区,但我会为美国邮政编码发布一个,因为我很熟悉这些模式:

include_once($_SERVER['DOCUMENT_ROOT'].'/wp-config.php');
include_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
include_once($_SERVER['DOCUMENT_ROOT'].'/wp-includes/wp-db.php');
include_once($_SERVER['DOCUMENT_ROOT'].'/wp-includes/class-phpass.php');

要允许使用字母数字,您可以将$_SERVER['DOCUMENT_ROOT']更改为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; } 。然而,如果不同的国家有不同的限制(他们这样做),它将变得丑陋。

当然,这不会进行任何类型的查找来捕获不存在或以某种方式保留/无效的邮政编码,但它可能比完全没有验证更好。如果你以后找到一些查找服务,你总是可以在这些静态方法之后调用它,因为我认为这会更昂贵。