Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Регулярное выражение почтового индекса Javascript в Великобритании

Автор вопроса: Phil YoungОтветов: 5

У меня есть регулярное выражение javascript, которое проверяет почтовые индексы Великобритании. Это работает хорошо, но не учитывает, что некоторые люди пишут с пробелами посередине, а другие нет. Я пытался добавить это, но не могу с этим справиться: почтовые индексы Великобритании в основном состоят из 2 букв, за которыми следуют 1 или 2 цифры, необязательный пробел, 1 цифра и 2 буквы.

Вот мое регулярное выражение, которое проверяет почтовые индексы без пробелов:

[A-PR-UWYZa-pr-uwyz0-9][A-HK-Ya-hk-y0-9][AEHMNPRTVXYaehmnprtvxy0-9]?[ABEHMNPRVWXYabehmnprvwxy0-9]?{1,2}[0-9][ABD-HJLN-UW-Zabd-hjln-uw-z]{2}|(GIRgir){3} 0(Aa){2})$/g

Любые идеи?

Изменить

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

  • Почему вы хотите проверять почтовые индексы на стороне клиента? Я бы предпочел провести строгую проверку на стороне сервера, поскольку злоумышленник может вставить неверные данные независимо от ваших проверок на стороне клиента. jsalonen 18.06.2012
  • @jsalonen, это не злонамеренный ввод, конечно, проверки на стороне сервера обязательны! Но вы также хотите показать своим пользователям размер клиента. Извините, сэр, я думаю, вы сделали ошибку, не могли бы вы ее исправить. Adi 18.06.2012
  • Если вы проверяете почтовые индексы на стороне сервера, вы можете повторно использовать этот код в проверках на стороне клиента: 1) отправить данные на сервер для проверки, 2) если проверка не удалась (на стороне сервера), вернуться обратно в форму с определенной ошибкой. сообщение. Поступая таким образом, вам не нужно будет поддерживать два отдельных кода проверки почтовых индексов! jsalonen 18.06.2012
  • Проверка почтового индекса запускает немедленное окно предупреждения перед вызовом ajax на сервер (чтобы облегчить трафик), где он также проверяется на стороне сервера. Как только я заработаю это регулярное выражение, я смогу преобразовать его в php. И @Adnan, это регулярное выражение было адаптировано мной из поиска Google, я не совсем новичок! :П Phil Young 18.06.2012
  • @jsalonen, так что в основном вы говорите, что КАЖДЫЙ РАЗ пользователь делает небольшую ошибку (например, дополнительный пробел в почтовом индексе), я должен отправить на сервер, а затем получить ответ, тогда моя функция обратного вызова будет Действуй соответственно. Отличная работа! Adi 18.06.2012
  • Я только что проверил точно такое же регулярное выражение в первой ссылке в этом поиске Google с помощью regexpal.com . Работает как шарм, попробуйте. Adi 18.06.2012

javascriptregexpostal-code

Ответы

Ответ 1 · рейтинг 6 · Mathias Bynens

Альтернативным решением было бы удалить все пробелы из строки, а затем запустить ее через регулярное выражение, которое у вас уже есть:

var postalCode = '...';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`

Ответ 2 · рейтинг 6 · Qtax

2 буквы, за которыми следуют 1 или 2 цифры, необязательный пробел и 1 цифра и 2 буквы.

Пример:

/^[a-z]{2}\d{1,2}\s*\d[a-z]{2}$/i

Объяснение с помощью http://www.myregextester.com/

  ^                        the beginning of the string
----------------------------------------------------------------------
  [a-z]{2}                 any character of: 'a' to 'z' (2 times)
----------------------------------------------------------------------
  \d{1,2}                  digits (0-9) (between 1 and 2 times
                           (matching the most amount possible))
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \d                       digits (0-9)
----------------------------------------------------------------------
  [a-z]{2}                 any character of: 'a' to 'z' (2 times)
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

Ответ 3 · рейтинг 3 · Phil H

Согласно страница из архива, которую я нашел, спецификация:

Pattern    w/o space   RLE                General
AN NAA     ANNAA       A1 N2 A2         | A{1,2} N{2,3} A2
ANN NAA    ANNNAA      A1 N3 A2         |
AAN NAA    AANNAA      A2 N2 A2         |
AANN NAA   AANNNAA     A2 N3 A2         |

ANA NAA    ANANAA      A1 N1 A1 N1 A2   | A{1,2} N1 A1 N1 A2
AANA NAA   AANANAA     A2 N1 A1 N1 A2   |

GIR 0AA    We are British and for every rule there must be an
           equal and opposite exception.

Возможно, это слишком хлопотно, чтобы возиться с проверкой страницы. Помните, вам придется поддерживать его, если когда-либо произойдет изменение. Рассмотрим минимальный чек, например ^[A-Z].+[0-9].+[A-Z]$. Не будьте "героем" и шаблонным кодом.

Если вы действительно хотите проверить его на соответствие этой спецификации, общие правила (после удаления пробелов):

^([A-Z]{1,2})([0-9]{2,3})([A-Z]{2})$/i
^([A-Z]{1,2})([0-9])([A-Z])([0-9])([A-Z]{2})$/i
^GIR0AA$/i

Как указал @Stefan: /i для нечувствительности к регистру.

Сделав это, вы можете сопоставить группы (отсюда фигурные скобки) и проверить, соответствуют ли буквы ограниченным диапазонам в документе. На этом этапе вы даже можете вести список разрешенных однобуквенных и двухбуквенных кодов для областей почтовых индексов.

Общее правило для отделения Incode (фрагмент перед пробелом) от Outcode (фрагмент после пробела), по-видимому, состоит в том, что Outcode начинается с последнего числа (даже для GIR).

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

[Редактировать: есть еще одна спецификация в Википедии, конечно]

Ответ 4 · рейтинг 2 · designgroop

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

  • A1 1AA
  • A1A 1AA
  • AA11 1AA

Исходя из этого, я бы рекомендовал:

/^([A-Z][A-Z0-9]?[A-Z0-9]?[A-Z0-9]? {1,2}[0-9][A-Z0-9]{2})$/;

Почтовый индекс GIR0AA раньше принадлежал Girobank, но больше не поддерживается, см. ссылку: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

Ответ 5 · рейтинг 1 · Zagorax

Я не знаю, как делается почтовый индекс Великобритании, и я не понял этого из вашего описания. Кстати, вы можете добавить \s{0,1} там, где нужно сказать "здесь у нас мог бы быть пробел". Это означает "0 или 1 пробел".

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы