RegEx для сопоставления почтовых индексов Великобритании - PullRequest
158 голосов
/ 03 октября 2008

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

Спички

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

Нет совпадений

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

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

Ответы [ 30 ]

177 голосов
/ 03 октября 2008

Я бы рекомендовал взглянуть на стандарт данных правительства Великобритании для почтовых индексов [ссылка сейчас не работает; архив 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), и они предоставляют более строгий тест, который вы могли бы попробовать.

79 голосов
/ 31 августа 2011

Похоже, мы будем использовать ^(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})$, который является слегка измененной версией, предложенной Минглисом выше.

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

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

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

^((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}))$

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

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

  • «ГИР 0АА»
  • 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.

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

Colin

41 голосов
/ 10 июня 2013

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

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

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

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

Кроме того, как отметил ряд других пользователей, есть специальные почтовые индексы, такие как Girobank, GIR 0AA, и один для писем Санте, 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                     |
+----------+----------------------------------------------+

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

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

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

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

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

26 голосов
/ 17 августа 2018

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

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


Примечание

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

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

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

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

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

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

^([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).

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

^([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. Это потому, что они привязали начало первого и конец второго (независимо друг от друга), как указано в регулярном выражении выше.

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

Аналогично, первая опция не привязана к концу строки $, поэтому 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 - Пробелы

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

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


Ответ

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$
20 голосов
/ 07 июля 2013

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

Ordnance Survey предоставляет услугу под названием 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

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

17 голосов
/ 03 октября 2008
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

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

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

14 голосов
/ 10 мая 2013

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

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})$

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

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

12 голосов
/ 23 апреля 2015

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

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

12 голосов
/ 12 ноября 2014

Старый пост, но все еще довольно высокий в результатах Google, поэтому думал, что я буду обновлять. Этот документ от 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), которых не было в предыдущих версиях.

10 голосов
/ 11 апреля 2013

Это регулярное выражение, которое 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...