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

У меня есть регулярное выражение 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

Любые идеи?

Изменить

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


person Phil Young    schedule 18.06.2012    source источник
comment
Почему вы хотите проверять почтовые индексы на стороне клиента? Я бы предпочел провести строгую проверку на стороне сервера, поскольку злоумышленник может вставить неверные данные независимо от ваших проверок на стороне клиента.   -  person jsalonen    schedule 18.06.2012
comment
@jsalonen, это не злонамеренный ввод, конечно, проверки на стороне сервера обязательны! Но вы также хотите показать своим пользователям размер клиента. Извините, сэр, я думаю, вы сделали ошибку, не могли бы вы ее исправить.   -  person Adi    schedule 18.06.2012
comment
Если вы проверяете почтовые индексы на стороне сервера, вы можете повторно использовать этот код в проверках на стороне клиента: 1) отправить данные на сервер для проверки, 2) если проверка не удалась (на стороне сервера), вернуться обратно в форму с определенной ошибкой. сообщение. Поступая таким образом, вам не нужно будет поддерживать два отдельных кода проверки почтовых индексов!   -  person jsalonen    schedule 18.06.2012
comment
Проверка почтового индекса запускает немедленное окно предупреждения перед вызовом ajax на сервер (чтобы облегчить трафик), где он также проверяется на стороне сервера. Как только я заработаю это регулярное выражение, я смогу преобразовать его в php. И @Adnan, это регулярное выражение было адаптировано мной из поиска Google, я не совсем новичок! :П   -  person Phil Young    schedule 18.06.2012
comment
@jsalonen, так что в основном вы говорите, что КАЖДЫЙ РАЗ пользователь делает небольшую ошибку (например, дополнительный пробел в почтовом индексе), я должен отправить на сервер, а затем получить ответ, тогда моя функция обратного вызова будет Действуй соответственно. Отличная работа!   -  person Adi    schedule 18.06.2012
comment
Я только что проверил точно такое же регулярное выражение в первой ссылке в этом поиске Google с помощью regexpal.com . Работает как шарм, попробуйте.   -  person Adi    schedule 18.06.2012
comment
@AdnanShammout Да. Я говорю об альтернативном решении, которое имеет некоторые компромиссы (как хорошие, так и плохие).   -  person jsalonen    schedule 18.06.2012
comment
@PhilFaceplantYoung /i делает ваше регулярное выражение нечувствительным к регистру: [A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?{1,2}[0-9][ABD-HJLN-UW-Z]{2}|(GIR){3} 0A{2})$/gi   -  person Stefan    schedule 18.06.2012
comment
@AdnanShammout на моем сайте сопоставляет только почтовые индексы, написанные заглавными буквами, с пробелом. Люди используют смесь символов и необязательных пробелов, поэтому он не охватывает все варианты. Например, в Regexpal DN15 9YG проверяет, а dn159yg нет, и оба являются допустимыми почтовыми индексами.   -  person Phil Young    schedule 18.06.2012
comment
Почтовые индексы BFPO форматируются по-разному.   -  person symcbean    schedule 18.06.2012
comment
Всегда можно просто схитрить и просто преобразовать его в верхний регистр и удалить все пробелы, прежде чем передавать его регулярному выражению.   -  person msanders    schedule 18.06.2012
comment
@symcbean Так же, как и адреса почтовых ящиков, но я собираюсь захватить их после того, как проверю стандартный почтовый индекс Великобритании.   -  person Phil Young    schedule 18.06.2012
comment
@Adnan Ну, по иронии судьбы, поиск UK Postcode Regex — это лучший результат Google; так что эээ.. ;)   -  person MackieeE    schedule 25.03.2014
comment
возможный дубликат регулярного выражения почтового индекса Великобритании (полного)   -  person Gajus    schedule 02.12.2014
comment
Не забывайте, что города Лондон и Вестминстер включают формат EC2A 1AA, WC1A 1AA и т. д.   -  person Martin Greenaway    schedule 26.10.2017


Ответы (5)


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

var postalCode = '…';
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace
yourRegex.test(postalCode); // `true` or `false`
person Mathias Bynens    schedule 18.06.2012

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
person Qtax    schedule 18.06.2012
comment
@ThisGuyHasTwoThumbs нет необходимости использовать {1} и включать оба случая при использовании /i, то есть: /^[a-z]{1,2}\d{1,2}\s*\d[a-z]{2}$/i. \d{1,2} также может быть записано как \d\d?. - person Qtax; 25.04.2017

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

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).

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

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

person Phil H    schedule 18.06.2012

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

  • 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

person designgroop    schedule 04.06.2013
comment
Это отличный ответ. Но почему бы не сократить его до: /^([A-Z][A-Z0-9]{0,3}\s?[0-9][A-Z0-9]{2})$/i - person glboothby; 16.07.2015
comment
Это не позволяет использовать почтовые индексы лондонского Сити или Вестминстера (EC1A, WC2A и т. д.). - person Martin Greenaway; 26.10.2017

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

person Zagorax    schedule 18.06.2012