Как проверить почтовый индекс в Java, если шаблон почтового индекса изменяется динамически?

Мне нужно проверить почтовый индекс в Java. Я погуглил, и есть много регулярных выражений.

У меня проблема в том, что требуемый шаблон почтового индекса может измениться со страницы некоторых настроек администратора. Как и в некоторых случаях, нам может понадобиться, чтобы пользователи вводили почтовый индекс в формате XXX - XXX или, возможно, (XXXXXX) и т. Д.

В некоторых случаях почтовый индекс может состоять только из цифр, а в некоторых случаях буквенно-цифровой.

Пожалуйста помоги.

2 ответа

Решение

К сожалению, нет хорошей поддержки локализации для почтовых адресов, включая почтовые индексы (или почтовые индексы). Этот пост в блоге (ему около года, но, к сожалению, он все еще актуален) описывает состояние проверки почтового адреса. В США почтовый сервис предлагает свой API проверки адреса; веб-протокол. Единственный известный мне инструмент - это библиотека Android, которая называется libaddressinput. В резюме проекта говорится, что, хотя пользовательский интерфейс ориентирован на Android, его можно использовать повторно.

Так как не существует отличного инструмента, вот код для применения некоторых шаблонов к почтовым индексам без использования регулярных выражений. Вы можете получить шаблоны из вашего сервлета, но для наглядности это показано в примере.

Хотя в вашем вопросе не указана страна, я опубликую ее для почтовых индексов США, поскольку эти шаблоны мне знакомы:

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, Однако будет ужасно, если разные страны будут иметь разные ограничения (что они и делают).

Конечно, это не приведет к поиску почтовых индексов, которые не существуют или каким-то образом зарезервированы / иным образом недействительны, но это, вероятно, лучше, чем вообще никакой проверки. Если позже вы найдете какой-нибудь сервис поиска, вы всегда можете вызвать его после этих статических методов, так как я представляю, что это будет дороже.

Другие вопросы по тегам