Как проверить почтовый индекс в 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
, Однако будет ужасно, если разные страны будут иметь разные ограничения (что они и делают).
Конечно, это не приведет к поиску почтовых индексов, которые не существуют или каким-то образом зарезервированы / иным образом недействительны, но это, вероятно, лучше, чем вообще никакой проверки. Если позже вы найдете какой-нибудь сервис поиска, вы всегда можете вызвать его после этих статических методов, так как я представляю, что это будет дороже.