繁体   English   中英

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

[英]How to validate zip code in java if the zip code pattern changes dynamically?

我需要验证Java中的邮政编码。 我已经用谷歌搜索,并且有很多正则表达式。

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

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

请帮忙。

不幸的是,对邮政地址(包括邮政编码(又称邮政编码))没有很好的本地化支持。 这篇博客文章 (大约有一年的历史了,但仍然很不幸,还是相关的)描述了邮政地址验证的遗憾状态。 在美国,邮政服务提供其地址验证API 基于网络的协议。 我知道的唯一其他工具是一个名为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 但是,如果不同的国家有不同的约束条件(它们这样做),将变得很丑陋。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM