如果邮政编码模式动态更改,如何在java中验证邮政编码



我需要在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。然而,如果不同的国家有不同的限制(它们确实有),情况就会变得很糟糕。

当然,这不会执行任何查找来捕获不存在或以某种方式保留或无效的邮政编码,但这可能比根本没有验证要好。如果您以后确实找到了一些查找服务,您可以总是在这些静态方法之后调用它,因为我认为那样会更昂贵。

最新更新