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

3

我需要在Java中验证邮政编码。我已经搜索了很多正则表达式。

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

在某些情况下,邮政编码只能包含数字,而在某些情况下可以是字母数字混合的形式。

请帮忙。


您是否希望能够(通过管理设置页面)定义自己的邮政编码格式或从预定义格式列表中进行选择? - Ben van Gompel
@Ben van Gompel。我们将在下拉列表中有一些预定义的邮政编码格式。 - ajm
所以,您需要为下拉列表中的每个选项指定一个正则表达式(或类似的内容),并确保正确的正则表达式用于验证邮政编码。 - Ben van Gompel
可能是什么是最终的邮政编码和邮政编码正则表达式?的重复问题。 - surhidamatya
2个回答

1

很遗憾,目前没有好的本地化支持邮政地址,包括邮政编码(也称为邮编)。这篇博客文章(虽然已经有一年了,但仍然不幸地相关)描述了邮政地址验证的糟糕状态。在美国,邮政服务提供他们的地址验证API;一个基于Web的协议。我所知道的唯一其他工具是一个名为libaddressinput的Android库。该项目摘要表示,虽然UI是特定于Android的,但后端可以被重用。


0

由于目前没有很好的工具可用,这里提供一些代码来应用一些邮政编码模式,而无需使用正则表达式。您可以从您的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。然而,如果不同的国家有不同的限制(事实上是这样的),这可能会变得很麻烦。

当然,这种方法并不会查找不存在或以其他方式无效的邮政编码,但它比没有验证要好得多。如果您稍后找到某些查找服务,您可以在这些静态方法之后调用它,因为我想那可能会更昂贵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接