【问题标题】:How to validate zip code in java if the zip code pattern changes dynamically?如果邮政编码模式动态变化,如何在java中验证邮政编码?
【发布时间】:2011-11-21 06:34:56
【问题描述】:

我需要在 java 中验证邮政编码。我google了一下,有很多正则表达式。

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

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

请帮忙。

【问题讨论】:

  • 您希望能够(通过管理设置页面)定义您自己的邮政编码格式还是从预定义格式列表中进行选择?
  • @Ben van Gompel。我们将在下拉列表中有一些预定义的邮政编码格式。
  • 因此,您需要为下拉列表中的每个选项指定正则表达式(或类似的内容),并确保使用正确的选项来验证邮政编码。

标签: java validation pattern-matching zipcode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    由于没有很好的工具,这里有一些代码可以在不使用正则表达式的情况下将一些模式应用于邮政编码。您可以使用 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。但是,如果不同的国家有不同的限制(他们确实这样做),它会变得很丑。

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

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多