RegEx для сопоставления почтовых индексов Великобритании - программирование

RegEx для сопоставления почтовых индексов Великобритании

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

Матчи

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • SE5 0EG
  • WC2H 7LT

Не совпадает

  • AWC2H 7LT
  • WC2H 7LTa
  • WC2H

Как мне решить эту проблему?

4b9b3361

Ответ 1

Я бы рекомендовал взглянуть на Стандарт данных правительства Великобритании для почтовых индексов [ссылка сейчас мертва; архив XML, см. Википедию для обсуждения]. Существует краткое описание данных, и прилагаемая xml-схема обеспечивает регулярное выражение. Это может быть не совсем то, что вы хотите, но будет хорошей отправной точкой. RegEx отличается от XML немного, так как в приведенном определении допускается символ P в третьей позиции в формате A9A 9AA.

RegEx, предоставленный правительством Великобритании, был:

([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\s?[0-9][A-Za-z]{2})

Как было указано в обсуждении в Википедии, это позволит сделать некоторые нереальные почтовые индексы (например, те, которые начинаются с AA, ZY), и они обеспечивают более строгий тест, который вы могли бы попробовать.

Ответ 2

Похоже, мы будем использовать ^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$, который является слегка измененной версией, описанной выше Minglis.

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

После некоторого исследования мы нашли дополнительную информацию. По-видимому, страница на govtalk.gov.uk указывает на спецификацию почтового индекса govtalk-postcodes. Это указывает на XML-схему в XML Schema, которая предоставляет выражение "псевдорежима" правил почтового индекса.

Мы взяли это и немного поработали над этим, чтобы дать нам следующее выражение:

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

Это делает пространство необязательным, но ограничивает вас одним пространством (замените '&' на '{0,} для неограниченных пробелов). Он предполагает, что весь текст должен быть в верхнем регистре.

Если вы хотите разрешить строчный регистр с любым количеством пробелов, используйте:

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

Это не охватывает заморские территории и только обеспечивает формат, а не существование разных областей. Он основан на следующих правилах:

Может принимать следующие форматы:

  • "GIR 0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

Где:

  • 9 может быть любым однозначным числом.
  • A может быть любой буквой, кроме Q, V или X.
  • B может быть любой буквой, кроме I, J или Z.
  • C может быть любой буквой, кроме I, L, M, N, O, P, Q, R, V, X, Y или Z.
  • D может быть любой буквой, кроме I, J или Z.
  • E может быть любым из A, B, E, H, M, N, P, R, V, W, X или Y.
  • Z может быть любой буквой, кроме C, I, K, M, O или V.

С наилучшими пожеланиями

Колин

Ответ 3

Нет такого понятия, как всеобъемлющее регулярное выражение для почтового индекса в Великобритании, которое может проверять почтовый индекс. Вы можете проверить, что почтовый индекс находится в правильном формате, используя регулярное выражение; а не то, что он на самом деле существует.

Почтовые индексы произвольно сложны и постоянно меняются. Например, outcode W1 не имеет и может никогда не иметь каждого номера от 1 до 99 для каждой области почтового индекса.

Вы не можете рассчитывать на то, что в настоящее время существует истина навсегда. Например, в 1990 году почтовое отделение решило, что Абердин становится немного переполненным. Они добавили 0 к концу AB1-5, сделав его AB10-50, а затем создали несколько почтовых индексов между ними.

Всякий раз, когда строится новая улица, создается новый почтовый индекс. Это часть процесса получения разрешения на сборку; локальные власти обязаны поддерживать это обновление в почтовом отделении (не все они делают).

Кроме того, как отмечает ряд других пользователей, существуют специальные почтовые индексы, такие как Girobank, GIR 0AA и один для писем в Santa, SAN TA1 - вы, вероятно, не хотите публиковать что-либо там, но оно не появляется должен быть покрыт любым другим ответом.

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

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

Далее, вы должны принять во внимание, что Великобритания "экспортировала" свою систему почтовых индексов во многие места мира. Все, что проверяет почтовый индекс "UK", также будет проверять почтовые индексы ряда других стран.

Если вы хотите проверить почтовый индекс в Великобритании, самым безопасным способом это будет использовать поиск текущих почтовых индексов. Существует несколько вариантов:

  • Ordnance Survey выпускает Code-Point Open под открытой лицензией. Это будет очень немного позади, но это бесплатно. Это (вероятно, я не могу вспомнить) не включать в себя данные Северной Ирландии, так как обследование боеприпасов там не существует. Картирование в Северной Ирландии проводится Обсервационным Обзором Северной Ирландии, и у них есть свой, отдельный, оплачиваемый продукт Pointer. Вы можете использовать это и добавить несколько, которые недостаточно покрыты.

  • Royal Mail выпускает файл адресов почтовых индексов (PAF), в том числе BFPO, который я не уверен, что Code-Point Open делает. Он регулярно обновляется, но стоит денег (и они могут быть прямолинейными по поводу этого иногда). PAF включает полный адрес, а не только почтовые индексы и поставляется со своим собственным руководством для программистов. Открытая группа пользователей данных (ODUG) в настоящее время лоббирует публикацию PAF бесплатно, здесь приводится описание их позиции.

  • Наконец, есть AddressBase. Это сотрудничество между Ordnance Survey, местными властями, Royal Mail и соответствующей компанией, чтобы создать окончательный каталог всей информации обо всех адресах Великобритании (они были довольно успешными, а также). Он оплачивается, но если вы работаете с местным органом, государственным департаментом или государственной службой, это бесплатно для них. Там гораздо больше информации, чем вставляются только почтовые индексы.

Ответ 4

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

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


Заметка

Мой ответ (и регулярные выражения в целом):

  • Проверяет только форматы почтовых индексов.
  • Не гарантирует, что почтовый индекс законно существует.
    • Для этого используйте соответствующий API! См Бен ответ для получения дополнительной информации.

Если вас не интересует плохое регулярное выражение и вы просто хотите перейти к ответу, прокрутите вниз до раздела " Ответ ".

Плохое регулярное выражение

Регулярные выражения в этом разделе не должны использоваться.

Это ошибочное регулярное выражение, которое правительство Великобритании предоставило разработчикам (не уверен, как долго будет действовать эта ссылка, но вы можете увидеть это в их документации Bulk Data Transfer):

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

Проблемы

Проблема 1 - Копировать/Вставить

Смотрите регулярное выражение в использовании здесь.

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

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))
[0-9][A-Za-z]{2})$

Первое, что сделает большинство разработчиков, это просто удалите новую строку, не задумываясь. Теперь регулярное выражение не будет сопоставлять почтовые индексы с пробелами в них (кроме GIR 0AA индекса GIR 0AA).

Чтобы решить эту проблему, символ новой строки должен быть заменен символом пробела:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                                     ^

Проблема 2 - Границы

Смотрите регулярное выражение в использовании здесь.

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
^^                     ^ ^                                                                                                                                            ^^

Регулярное выражение почтового индекса неправильно привязывает регулярное выражение. Любой, кто использует это регулярное выражение для проверки почтовых индексов, может быть удивлен, если fooA11 1AA значение типа fooA11 1AA. Это потому, что они привязали начало первого варианта и конец второго (независимо друг от друга), как указано в регулярном выражении выше.

Это означает, что ^ (устанавливает положение в начале строки) работает только с первым параметром ([Gg][Ii][Rr] 0[Aa]{2}), поэтому второй параметр будет проверять любые строки, заканчивающиеся в почтовый индекс (независимо от того, что приходит раньше).

Аналогично, первая опция не привязана к концу строки $, поэтому GIR 0AAfoo также принимается.

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

Чтобы решить эту проблему, оба параметра должны быть заключены в другую группу (или группу без захвата), а вокруг них должны быть размещены якоря:

^(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
^^                                                                                                                                                                      ^^

Проблема 3 - Неправильный набор символов

Смотрите регулярное выражение в использовании здесь.

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                       ^^

Регулярное выражение отсутствует - здесь, чтобы указать диапазон символов. На самом деле, если почтовый индекс имеет формат ANA NAA (где A представляет букву, а N представляет число), и он начинается с чего-либо, кроме A или Z, произойдет сбой.

Это означает, что он будет соответствовать A1A 1AA и Z1A 1AA, но не B1A 1AA.

Чтобы решить эту проблему, символ - должен быть помещен между A и Z в соответствующем наборе символов:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                        ^

Проблема 4 - Неправильный дополнительный набор символов

Смотрите регулярное выражение в использовании здесь.

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                        ^

Я клянусь, что они даже не проверяли эту вещь, прежде чем публиковать ее в Интернете. Они сделали неправильный набор символов необязательным. Они сделали опцию [0-9] в четвертой подопции опции 2 (группа 9). Это позволяет регулярному выражению соответствовать неправильно отформатированным почтовым индексам, таким как AAA 1AA.

Чтобы решить эту проблему, сделайте следующий класс символов необязательным (и впоследствии сделайте так, чтобы набор [0-9] совпадал ровно один раз):

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?)))) [0-9][A-Za-z]{2})$
                                                                                                                                                ^

Проблема 5 - Производительность

Производительность на этом регулярном выражении крайне плохая. Прежде всего, они поместили наименее вероятный вариант шаблона, чтобы соответствовать GIR 0AA в начале. Сколько пользователей будет иметь этот почтовый индекс по сравнению с любым другим почтовым индексом; наверное никогда? Это означает, что каждый раз, когда используется регулярное выражение, он должен сначала исчерпать эту опцию, прежде чем перейти к следующей. Чтобы увидеть, как это влияет на производительность, проверьте количество шагов, которые исходное регулярное выражение (35) предприняло по отношению к тому же регулярному выражению после переключения опций (22).

Вторая проблема с производительностью связана с тем, как структурировано все регулярное выражение. Там нет смысла возвращаться назад по каждому варианту, если один не удается. Способ структурирования текущего регулярного выражения может быть значительно упрощен. Я исправляю это в разделе " Ответ ".

Задача 6 - Пространства

Смотрите регулярное выражение в использовании здесь

Это само по себе не может считаться проблемой, но вызывает беспокойство у большинства разработчиков. Пробелы в регулярном выражении не являются обязательными, это означает, что пользователи, вводящие свои почтовые индексы, должны поместить пробел в почтовый индекс. Это легко исправить, просто добавив ? после пробелов отображать их необязательно. Смотрите раздел Ответ для исправления.


Ответ

1. Исправление регулярного выражения правительства Великобритании

Исправление всех проблем, описанных в разделе " Проблемы ", и упрощение шаблона приводит к следующему, более короткому и краткому шаблону. Мы также можем удалить большинство групп, так как мы проверяем почтовый индекс в целом (не отдельные части):

Смотрите регулярное выражение в использовании здесь

^([A-Za-z][A-Ha-hJ-Yj-y]?[0-9][A-Za-z0-9]? ?[0-9][A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$

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

Смотрите регулярное выражение в использовании здесь.

^([A-Z][A-HJ-Y]?[0-9][A-Z0-9]? ?[0-9][A-Z]{2}|GIR ?0A{2})$

Короче, снова заменив [0-9] на \d (если ваш движок регулярных выражений поддерживает это):

Смотрите регулярное выражение в использовании здесь.

^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

2. Упрощенные паттерны

Без указания конкретных буквенных символов можно использовать следующее (имейте в виду, что здесь были использованы упрощения, приведенные в разделе 1. Исправление регулярного выражения правительства Великобритании):

Смотрите регулярное выражение в использовании здесь.

^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

И даже дальше, если вас не волнует особый случай GIR 0AA:

^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$

3. Сложные паттерны

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

Вот сложные регулярные выражения, которые включают в себя подразделы 3. (3.1, 3.2, 3.3).

По отношению к шаблонам в 1. Исправление регулярного выражения правительства Великобритании:

Смотрите регулярное выражение в использовании здесь

^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

И по отношению к 2. Упрощенные паттерны:

Смотрите регулярное выражение в использовании здесь

^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

3.1 Британские заморские территории

В настоящее время статья в Википедии гласит (некоторые форматы немного упрощены):

  • AI-1111: Ангилья
  • ASCN 1ZZ: Остров Вознесения
  • STHL 1ZZ: остров Святой Елены
  • TDCU 1ZZ: Тристан-да-Кунья
  • BBND 1ZZ: Британская территория в Индийском океане
  • BIQQ 1ZZ: Британская антарктическая территория
  • FIQQ 1ZZ: Фолклендские острова
  • GX11 1ZZ: Гибралтар
  • PCRN 1ZZ: Острова Питкэрн
  • SIQQ 1ZZ: Южная Георгия и Южные Сандвичевы острова
  • TKCA 1ZZ: острова Теркс и Кайкос
  • BFPO 11: Акротири и Декелия
  • ZZ 11 & GE CX: Бермудские острова (согласно этому документу)
  • KY1-1111: Каймановы острова (согласно этому документу)
  • VG1111: Британские Виргинские острова (согласно этому документу)
  • MSR 1111: Монтсеррат (согласно этому документу)

Всеобъемлющее регулярное выражение для соответствия только британским заморским территориям может выглядеть так:

Смотрите регулярное выражение в использовании здесь.

^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$

3.2 Почтовое отделение британских войск

Хотя они были недавно изменены, чтобы лучше соответствовать британской системе почтовых индексов на BF# (где # представляет число), они считаются необязательными альтернативными почтовыми индексами. Эти почтовые индексы соответствуют (ed) формату BFPO, за которым следуют 1-4 цифры:

Смотрите регулярное выражение в использовании здесь

^BFPO ?\d{1,4}$

3.3 Санта?

Есть еще один особый случай с Сантой (как уже упоминалось в других ответах): SAN TA1 является действующим почтовым индексом. Регулярное выражение для этого очень просто:

^SAN ?TA1$

Ответ 5

Я рассмотрел некоторые из приведенных выше ответов, и я бы рекомендовал не использовать шаблон из @Dan answer (c. Dec 15 '10), поскольку он неправильно помещает почти 0,4% действительных почтовых индексов как недействительные, а другие - нет.

Обследование боеприпасов предоставляет сервис под названием Code Point Open, который:

содержит список всех существующих почтовых индексов в Великобритании

Я выполнил каждое из указанных выше выражений против полного списка почтовых индексов (июль 6 '13) из этих данных, используя grep:

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --perl-regexp "$pattern"

Общее количество почтовых индексов составляет 1,686,202.

Ниже приведены числа действительных почтовых индексов, которые не соответствуют каждому $pattern:

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)
'^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$'
# => 0
'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$'
# => 0

Конечно, эти результаты касаются только действительных почтовых индексов, которые неправильно помечены как недопустимые. Итак:

'^.*$'
# => 0

Я ничего не говорю о том, какой шаблон лучше всего подходит для фильтрации недопустимых почтовых индексов.

Ответ 6

^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

Регулярное выражение для соответствия действующей Великобритании почтовые индексы. В почтовой системе Великобритании нет все буквы используются во всех позициях (то же самое с регистрацией транспортного средства пластины), и существуют различные правила для управляйте этим. Это регулярное выражение принимает учет этих правил. Подробная информация о правила: первая половина почтового кода Valid форматы [A-Z] [A-Z] [0-9] [A-Z] [A-Z] [A-Z] [0-9] [0-9] [A-Z] [0-9] [0-9] [A-Z] [A-Z] [0-9] [A-Z] [A-Z] [A-Z] [A-Z] [0-9] [A-Z] [A-Z] [0-9] Исключения Позиция - первая. Contraint - QVX не Использованная позиция - вторая. Контрастность - IJZ не используется, кроме GIR 0AA Позиция - в-третьих. Ограничение - AEHMNPRTVXY использовал только позицию - Forth. Контраст - ABEHMNPRVWXY Второй половина допустимых форматов почтового индекса [0-9] [A-Z] [A-Z] Исключения - Второй и третий. Контраст - ЦИКМОВ не используется

http://regexlib.com/REDetails.aspx?regexp_id=260

Ответ 7

Большинство ответов здесь не работало для всех почтовых индексов, которые у меня есть в моей базе данных. Я, наконец, нашел тот, который проверяет все, используя новое регулярное выражение, предоставленное правительством:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf

Это ни в одном из предыдущих ответов, поэтому я размещаю его здесь, если они берут ссылку вниз:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

UPDATE: обновлено регулярное выражение, как указал Джейми Булл. Не уверен, что это было мое копирование ошибок, или это было ошибкой в правительственном регулярном выражении, теперь ссылка отсутствует...

ОБНОВЛЕНИЕ: Как найдено ctwheels, это регулярное выражение работает с ароматом regex javascript. См. Его комментарий к тому, который работает с ароматом pcre (php).

Ответ 8

Старое сообщение, но все еще довольно высокое в результатах Google, поэтому я подумал, что буду обновлять. Этот документ Oct 14 определяет регулярное выражение для почтового индекса в Великобритании:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

из:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

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

^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$

Это работает с новыми лондонскими почтовыми индексами (например, W1D 5LH), которых не было в предыдущих версиях.

Ответ 9

Согласно этой таблице Википедии

enter image description here

Этот шаблон охватывает все случаи

(?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2})

При использовании на Android\Java используйте\\d

Ответ 10

Это регулярное выражение Google служит в домене i18napis.appspot.com:

GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}

Ответ 11

Почтовые индексы могут быть изменены, и единственный верный способ проверки почтового индекса - иметь полный список почтовых индексов и посмотреть, есть ли там.

Но регулярные выражения полезны, потому что они:

  • просты в использовании и реализуют
  • короткие
  • быстро запускаются
  • довольно просты в обслуживании (по сравнению с полным списком почтовых индексов)
  • все еще улавливает большинство ошибок ввода

Но регулярные выражения, как правило, трудно поддерживать, особенно для тех, кто не придумал это в первую очередь. Так должно быть:

  • как можно проще понять
  • относительно будущего доказательства

Это означает, что большинство регулярных выражений в этом ответе недостаточно хороши. Например. Я вижу, что [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] будет соответствовать области почтового индекса формы AA1A - но это будет боль в области шеи, если и когда добавится новая область почтового индекса, потому что трудно понять, какие области почтового индекса он соответствует.

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

Итак, я придумал это:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

В формате PCRE его можно записать следующим образом:

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

Для меня это правильный баланс между валидацией, насколько это возможно, и в то же время будущая проверка и удобство обслуживания.

Ответ 12

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

Регулярное выражение и некоторый простой код для проверки почтового кода PHP размещены ниже. ПРИМЕЧАНИЕ. - Он допускает почтовые индексы нижнего или верхнего регистра и аномалию GIR 0AA, но для борьбы с более вероятным присутствием пространства в середине введенного почтового индекса он также использует простое str_replace для удаления пространства перед тестированием против регулярного выражения. Любые расхождения, помимо этого, и Королевская почта сами не упоминают их в своей литературе (см. http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf и начните читать со страницы 17)!

Примечание: В собственной литературе Royal Mail (ссылка выше) есть небольшая двусмысленность вокруг 3-й и 4-й позиций и исключения, если эти символы являются буквами. Я связался с Royal Mail напрямую, чтобы разобраться и своими словами "Письмо в 4-й позиции Внешнего кода с форматом AANA NAA не имеет исключений, а исключения третьей позиции относятся только к последней букве Внешнего кода с формат ANA NAA". Прямо от устья лошади!

<?php

    $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i';

    $postcode2check = str_replace(' ','',$postcode2check);

    if (preg_match($postcoderegex, $postcode2check)) {

        echo "$postcode2check is a valid postcode<br>";

    } else {

        echo "$postcode2check is not a valid postcode<br>";

    }

?>

Я надеюсь, что это поможет кому-то еще, кто сталкивается с этой нитью, ищет решение.

Ответ 13

Здесь regex на основе формата, указанного в документах, связанных с ответом marcj:

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

Единственное различие между этим и спецификациями состоит в том, что последние 2 символа не могут быть в [CIKMOV] в соответствии с спецификациями.

Изменить: Вот еще одна версия, которая проверяет ограничения на ограничение символов.

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/

Ответ 14

Некоторые из приведенных выше выражений немного ограничены. Обратите внимание на подлинный почтовый индекс: "W1K 7AA" потерпит неудачу с учетом правила "Позиция 3 - только AEHMNPRTVXY" выше, поскольку "K" будет запрещен.

регулярное выражение:

^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$

Кажется немного более точным, см. Статья в Википедии, озаглавленная "Почтовые индексы в Соединенном Королевстве" .

Обратите внимание, что для этого регулярного выражения требуются только буквы верхнего регистра.

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

Ответ 15

Основные правила:

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

Почтовые коды в U.K. (или почтовые индексы, как они называются) состоят из пяти-семи буквенно-цифровых символов, разделенных пробелом. Правила, охватывающие символы, которые могут появляться на определенных позициях, довольно сложны и чреваты исключениями. Таким образом, регулярное выражение всегда придерживается основных правил.

Полные правила:

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

^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$

Источник: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

Протестировано против нашей базы данных наших клиентов и кажется совершенно точным.

Ответ 16

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

([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})

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

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

Ответ 17

Первая половина почтового индекса Действительные форматы

  • [A-Z] [A-Z] [0-9] [A-Z]
  • [A-Z] [A-Z] [0-9] [0-9]
  • [A-Z] [0-9] [0-9]
  • [A-Z] [A-Z] [0-9]
  • [A-Z] [A-Z] [A-Z]
  • [A-Z] [0-9] [A-Z]
  • [A-Z] [0-9]

Исключения
Позиция 1 - QVX не используется
Позиция 2 - IJZ не используется, кроме GIR 0AA
Позиция 3 - используется только AEHMNPRTVXY
Позиция 4 - ABEHMNPRVWXY

Вторая половина почтового индекса

  • [0-9] [A-Z] [A-Z]

Исключения
Позиция 2 + 3 - CIKMOV не используется

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

Ответ 18

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

^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$

Объяснение:

  • ожидать 1 или 2 символа a-z, верхний или нижний штраф
  • ожидать 1 или 2 числа
  • ожидать 0 или 1 a-z char, верхний или нижний штраф
  • дополнительное пространство разрешено
  • ожидать 1 номер
  • ожидать 2 a-z, верхний или нижний штраф

Это получает большинство форматов, затем мы используем db для проверки подлинности почтового индекса, эти данные управляются openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

надеюсь, что это поможет

Ответ 19

Проверка почтового индекса в допустимом формате в соответствии с инструкцией Royal Mail :

          |----------------------------outward code------------------------------| |------inward code-----|
#special↓       α1        α2    AAN  AANA      AANN      AN    ANN    ANA (α3)        N         AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

Все почтовые индексы на doogal.co.uk соответствуют, за исключением тех, которые больше не используются.

Добавление ? после пробела и использование нечувствительного к регистру совпадения для ответа на этот вопрос:

'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]

Ответ 20

Это позволяет пустым пространствам и вкладкам с обеих сторон в случае, если вы не хотите отказывать в проверке, а затем обрезаете его на стороне.

^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$)

Ответ 21

Мне понадобилось простое регулярное выражение, где было бы неплохо позволить слишком много, но не отрицать действительный почтовый индекс. Я пошел с этим (входная строка разделена/обрезана):

/^([a-z0-9]\s*){5,7}$/i

Длина от 5 до 7 (без учета пробелов) означает, что мы допускаем кратчайшие почтовые индексы типа "L1 8JQ", а также самые длинные, такие как "OL14 5ET".

РЕДАКТИРОВАТЬ: Изменено 8 до 7, поэтому мы не допускаем почтовых индексов по 8 символов.

Ответ 22

Чтобы добавить к этому списку, более практичное регулярное выражение, которое я использую, позволяет пользователю вводить empty string:

^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

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

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

Ответ 23

Посмотрите на код python на этой странице:

http://www.brunningonline.net/simon/blog/archives/001292.html

У меня есть синтаксический анализ почтового индекса. Требование довольно простое; Я должен разбирать почтовый индекс в outcode и (необязательно). Хорошим новым является то, что мне не нужно выполнять какую-либо проверку - мне просто нужно нарезать то, что мне предоставили смутно разумным образом. Я не могу много думать о моем импорте с точки зрения форматирования, то есть случая и встроенных пространств. Но это не плохая новость; плохая новость заключается в том, что я должен делать все это в RPG.: - (

Тем не менее, я бросил небольшую функцию Python вместе, чтобы прояснить мое мышление.

Я использовал его для обработки почтовых индексов для меня.

Ответ 24

У меня есть регулярное выражение для проверки почтового индекса в Великобритании.

Это работает для любого типа почтового индекса, как внутреннего, так и внешнего

^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$

Это работает для всех типов форматов.

Пример:

AB10 -------------------- > ТОЛЬКО ВНЕШНИЙ ПОЧТОЙ

A1 1AA ------------------ > КОМБИНАЦИЯ (ВНЕШНИЙ И ВНУТРЕННИЙ) POSTCODE

WC2A -------------------- > ВНЕШНИЙ

Ответ 25

Нам дали спецификацию:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

Мы пришли к следующему:

/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i

Но заметьте - это позволяет любое количество пробелов между группами.

Ответ 26

Принятый ответ отражает правила, заданные Royal Mail, хотя в регулярном выражении есть опечатка. Эта опечатка, похоже, была там и на сайте gov.uk(как на странице архива XML).

В формате A9A 9AA правила допускают символ P в третьей позиции, в то время как регулярное выражение запрещает это. Правильное регулярное выражение будет:

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

Сокращение этого результата приводит к следующему регулярному выражению (которое использует синтаксис Perl/Ruby):

(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2})

Он также включает дополнительное пространство между первым и вторым блоками.

Ответ 27

здесь вы можете найти несколько полезных ссылок, зависит от того, какой язык вы используете:

http://www.ukpostcode.net/wiki/develop

Ответ 28

То, что я нашел почти во всех вариациях и регулярном выражении из объемной передачи pdf, и что находится на сайте wikipedia, это, в частности, для регулярного выражения wikipedia, должно быть a ^ после первого | (вертикальная полоса), Я понял это, тестируя AA9A 9AA, потому что в противном случае проверка формата для A9A 9AA будет проверять его. Для примера проверка EC1D 1BB, которая должна быть недействительной, возвращается, так как C1D 1BB является допустимым форматом.

Вот что я нашел для хорошего регулярного выражения:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$

Ответ 29

Мне нужна версия, которая будет работать в SAS с PRXMATCH и связанными с ней функциями, поэтому я придумал следующее:

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

Тестовые примеры и примечания:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;

Ответ 30

Ниже метод проверит почтовый индекс и предоставит полную информацию

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = '${fromat[1]} ${fromat[2]}';
        const regex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/i;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}