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

StackOverflow https://stackoverflow.com/questions/164979

Вопрос

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

Матчи

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

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

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H ( ВК2Ч )

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

  • “GIR 0AA” (ДЕВОЧКА 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.

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

Колин

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

Почтовые индексы сколь угодно сложны и постоянно меняются.Например, внешний код 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.Картографирование в Северной Ирландии проводится Ordnance Survey of Northern Ireland, и у них есть свои отдельные платные, Указатель продукт.Вы могли бы использовать это и добавить те немногие, которые не охвачены достаточно легко.

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

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

Недавно я опубликовал ответ Для этот вопрос о почтовых индексах Великобритании для языка 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}), таким образом , второй вариант будет проверять любые строки , которые конец в почтовом индексе (независимо от того, что было раньше).

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

Я просмотрел некоторые из ответов выше, и я бы не рекомендовал использовать шаблон от @Dan's ответ (c.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

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

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

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

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

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

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

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

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

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

Это регулярное выражение, которое 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}

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

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

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

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

  • настолько простой для понимания, насколько это возможно
  • относительно перспективный вариант

Это означает, что большинство регулярных выражений в этом ответе недостаточно хороши.Например.Я могу видеть это [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

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

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

Регулярное выражение и некоторый простой PHP-код для проверки почтового индекса размещены ниже.ПРИМЕЧАНИЕ:- Это допускает почтовые индексы в нижнем или верхнем регистре и аномалию GIR 0AA, но для устранения, более чем вероятного, наличия пробела в середине введенного почтового индекса также используется простая str_replace для удаления пробела перед тестированием на соответствие регулярному выражению.Любые расхождения, помимо этого, и сама Royal Mail даже не упоминают о них в своей литературе (см. 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 не имеет исключений, а исключения на 3-й позиции применимы только к последней букве Внешнего кода в формате 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>";

    }

?>

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

Вот регулярное выражение, основанное на формате, указанном в документах, которые связаны с ответом 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}$/

Некоторые из приведенных выше регулярных выражений немного ограничивают возможности.Обратите внимание на подлинный почтовый индекс:"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.

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

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

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

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

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

^(?:(?:[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

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

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

([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})

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

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

Первая половина допустимых форматов почтовых индексов

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

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

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

  • [0-9][А-Я][А-Я]

Исключения
Позиция 2+3 - ЧИКМОВ не использован

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

вот как мы решали проблему с почтовым индексом Великобритании:

^([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, верхний или нижний нормально
  • допускается дополнительное пространство
  • ожидайте 1 число
  • ожидайте 2 a-z, верхний или нижний штраф

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

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

Чтобы проверить, что почтовый индекс находится в допустимом формате в соответствии с руководство программиста:

          |----------------------------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" ]

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

^\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*$)

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

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

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

Редактировать:Изменил 8 на 7, поэтому мы не разрешаем использовать почтовые индексы из 8 символов.

Чтобы добавить к этому списку более практичное регулярное выражение, которое я использую, позволяющее пользователю вводить 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}))$

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

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

Взгляните на код python на этой странице:

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

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

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

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

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

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

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

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

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

^((([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------------------> КОМБИНАЦИЯ (ВНЕШНЕГО И ВНУТРЕННЕГО) ПОЧТОВОГО индекса

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

Принятый ответ отражает правила, предоставленные 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})

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

То, что я нашел почти во всех вариантах и регулярном выражении из pdf-файла с массовым переносом и что есть на сайте Википедии, заключается в следующем, особенно для регулярного выражения Википедии, после первого | должно быть ^ (вертикальная полоса).Я выяснил это, протестировав для 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})$

Мне нужна была версия, которая работала бы в 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;

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

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!"}

Я украл это из XML-документа, и, похоже, он охватывает все случаи без жестко закодированного GIRO:

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(Синтаксис Ruby с игнорированием регистра)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top